【问题标题】:Is there an equivalent method to C's scanf in Java?Java中是否有与C的scanf等效的方法?
【发布时间】:2013-06-03 14:11:31
【问题描述】:

Java 有format strings 的概念,与format strings in other languages 非常相似。它用于像String#format()这样的JDK方法中进行输出转换。

我想知道Java中是否有类似于C's scanf的输入转换方法?

【问题讨论】:

  • Java 有 String.format(format, args)(与 printf 非常相似)有人想知道是否有 scanf 等价物是可以理解的。我不知道为什么这个问题被否决了。
  • Scanner.next(Pattern pattern) 可以和Scanner.hasPattern(Pattern pattern) 一起使用进行验证。参考:docs.oracle.com/javase/7/docs/api/java/util/…这是一个中肯的问题,请大家重新打开!
  • @AndrewG.H.我做了一个大刀阔斧的编辑并提交重新打开。 FWIW,我同意。

标签: java


【解决方案1】:

看看this site,它解释了两种在java中从控制台读取的方法,使用Scanner或来自System.in的经典InputStreamReader

以下代码来自引用的网站:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ReadConsoleSystem {
  public static void main(String[] args) {

    System.out.println("Enter something here : ");

    try{
        BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));
        String s = bufferRead.readLine();

        System.out.println(s);
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }

  }
}

--

import java.util.Scanner;

public class ReadConsoleScanner {
  public static void main(String[] args) {

      System.out.println("Enter something here : ");

       String sWhatever;

       Scanner scanIn = new Scanner(System.in);
       sWhatever = scanIn.nextLine();

       scanIn.close();            
       System.out.println(sWhatever);
  }
}

问候。

【讨论】:

  • @Gopichand 在 java 中没有完全匹配,但是看看Scanner doc,你可以从标准输入读取特定类型的数据。例如:int i = scanIn.nextInt(); 用于读取 int。
  • @Gopichand 遗憾的是,java 中没有像 scanf 这样的确切方法。您可以做的更好的方法是拆分一个字符串,然后获取令牌并转换它们。如果有人与我不同,请给我看一个 scanf("%d %d %s %f",a,b,c,d) 的例子,java 中的一个等价线!
【解决方案2】:

标准 Java 中没有纯 scanf 替代品,但您可以使用 java.util.Scanner 来解决您将使用 scanf 解决的相同问题。

【讨论】:

    【解决方案3】:

    不是等价物,但您可以使用 Scanner 和模式来解析由空格分隔的三个非负数的行,例如:

    71 5796 2489
    88 1136 5298
    42 420 842
    

    这是使用findAll的代码:

    new Scanner(System.in).findAll("(\\d+) (\\d+) (\\d+)")
            .forEach(result -> {
                int fst = Integer.parseInt(result.group(1));
                int snd = Integer.parseInt(result.group(2));
                int third = Integer.parseInt(result.group(3));
                int sum = fst + snd + third;
                System.out.printf("%d + %d + %d = %d", fst, snd, third, sum);
            });
    

    【讨论】:

      【解决方案4】:

      如果有人真的愿意,他们可以制作自己的scanf() 版本,如下所示:

          import java.util.ArrayList;
          import java.util.Scanner;
      
      public class Testies {
      
      public static void main(String[] args) {
          ArrayList<Integer> nums = new ArrayList<Integer>();
          ArrayList<String> strings = new ArrayList<String>();
      
          // get input
          System.out.println("Give me input:");
          scanf(strings, nums);
      
          System.out.println("Ints gathered:");
          // print numbers scanned in
          for(Integer num : nums){
              System.out.print(num + " ");
          }
          System.out.println("\nStrings gathered:");
          // print strings scanned in
          for(String str : strings){
              System.out.print(str + " ");
          }
      
          System.out.println("\nData:");
          for(int i=0; i<strings.size(); i++){
              System.out.println(nums.get(i) + " " + strings.get(i));
          }
      }
      
      // get line from system
      public static void scanf(ArrayList<String> strings, ArrayList<Integer> nums){
          Scanner getLine = new Scanner(System.in);
          Scanner input = new Scanner(getLine.nextLine());
      
          while(input.hasNext()){
              // get integers
              if(input.hasNextInt()){
                  nums.add(input.nextInt());
              }
              // get strings
              else if(input.hasNext()){
                  strings.add(input.next());
              }
          }
      }
      
      // pass it a string for input
      public static void scanf(String in, ArrayList<String> strings, ArrayList<Integer> nums){
          Scanner input = (new Scanner(in));
      
          while(input.hasNext()){
              // get integers
              if(input.hasNextInt()){
                  nums.add(input.nextInt());
              }
              // get strings
              else if(input.hasNext()){
                  strings.add(input.next());
              }
          }
      }
      
      
      }
      

      显然我的方法只检查字符串和整数,如果您想处理不同的数据类型,请添加适当的数组列表并检查它们。此外,hasNext() 可能应该位于if-else if 序列的底部,因为hasNext() 将为字符串中的所有数据返回true。

      输出:

      Give me input: apples 8 9 pears oranges 5 Ints gathered: 8 9 5 Strings gathered: apples pears oranges Data: 8 apples 9 pears 5 oranges

      可能不是最好的例子;但是,重点是 Scanner 实现了 Iterator 类。使用hasNext&lt;datatypehere&gt;() 方法可以轻松地遍历扫描仪输入;然后存储输入。

      【讨论】:

        【解决方案5】:

        C/C++ 有一个变量references 的概念,这使得创建scanf 之类的东西要容易得多。但是,在 Java 中,一切都是按值传递的。在对象的情况下,它们的引用是按值传递的。

        因此,基本上不可能有一个简洁的等价于scanf。但是,您可以使用java.util.Scanner,它的作用类似于scanf

        所以这个 C/C++:

        int a;
        float b;
        
        scanf("%d %f", &a, &b);
        

        (大致)相当于这个 Java:

        int a;
        float b;
        try (Scanner sc = new Scanner(System.in)) {
          a = sc.nextInt();
          b = sc.nextFloat();
        }
        

        【讨论】:

          【解决方案6】:

          Java 总是将参数作为字符串类型...(String args[]) 所以你需要转换成你想要的类型。

          • 使用Integer.parseInt() 将您的字符串转换为整数。
          • 要打印任何字符串,您可以使用System.out.println()

          示例:

            int a;
            a = Integer.parseInt(args[0]);
          

          对于标准输入,您可以使用类似

          的代码
            StdIn.readInt();
            StdIn.readString();
          

          【讨论】:

          • StdIn 不是 java 中的类。我相信这是普林斯顿大学的人写的一门课link。但是,如果您的项目中有该类,它将起作用。如果您查看StdIn 的代码,他们只需使用Scanner 来读取所有输入。
          【解决方案7】:

          还有一个更简单的答案

          import java.io.BufferedReader;
          import java.util.Scanner;
          
          public class Main {
          
              public static void main(String[] args)
              {
                  String myBeautifulScanf = new Scanner(System.in).nextLine();
                  System.out.println( myBeautifulScanf );
          
              }
          }
          

          【讨论】:

          • 这并不比公认的答案简单,是一样的。
          • 代码更少,更简单。已接受答案中所有不重要的部分都已清除
          【解决方案8】:

          您可以按照下面的代码 sn-p 所述在 Java 中格式化输出。

          public class TestFormat {
          
              public static void main(String[] args) {
                long n = 461012;
                System.out.format("%d%n", n);      //  -->  "461012"
                System.out.format("%08d%n", n);    //  -->  "00461012"
                System.out.format("%+8d%n", n);    //  -->  " +461012"
                System.out.format("%,8d%n", n);    // -->  " 461,012"
                System.out.format("%+,8d%n%n", n); //  -->  "+461,012"
             }
          }
          

          您可以阅读更多here.

          【讨论】:

          • 问题是关于输入,而不是输出。
          猜你喜欢
          • 1970-01-01
          • 2010-12-23
          • 1970-01-01
          • 1970-01-01
          • 2018-11-20
          • 2012-02-17
          • 2021-09-17
          • 1970-01-01
          • 2013-07-25
          相关资源
          最近更新 更多