34

Java 有格式化字符串的概念,与其他语言的格式化字符串非常相似。它用于 JDK 方法中,例如String#format()用于输出转换。

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

4

8 回答 8

22

看看这个网站,它解释了两种从 java 中的控制台读取的方法,使用System.in中Scanner的或经典的。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);
  }
}

问候。

于 2013-06-07T10:01:24.230 回答
12

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

于 2013-06-07T09:58:08.420 回答
2

不是等效的,但您可以使用 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);
        });
于 2019-10-22T14:22:50.153 回答
1

如果有人真的想要,他们可以制作自己的版本,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<datatypehere>();然后存储输入。

于 2017-07-06T00:56:57.817 回答
1

C/C++ 有一个变量引用的概念,这使得创建类似的东西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();
}
于 2021-04-05T01:01:39.353 回答
0

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

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

例子 :

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

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

  StdIn.readInt();
  StdIn.readString();
于 2013-06-07T10:05:06.370 回答
0

还有一个更简单的答案

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 );

    }
}
于 2017-12-07T07:53:30.427 回答
-6

您可以按照以下代码片段中的说明在 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"
   }
}

你可以在这里阅读更多

于 2015-03-22T05:25:46.943 回答