在Java中是否有与C的scanf等效的方法?

时间:2013-06-07 09:55:30

标签: java

Java有format strings的概念,与format strings in other languages有很强的相似性。它在String#format()之类的JDK方法中用于输出转换。

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

8 个答案:

答案 0 :(得分:19)

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

以下代码摘自引用网站:

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

问候。

答案 1 :(得分:12)

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

答案 2 :(得分: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());
        }
    }
}


}

显然我的方法只检查字符串和整数,如果你想要处理不同的数据类型,添加适当的arraylists并检查它们。此外,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>()方法轻松迭代扫描仪输入;然后存储输入。

答案 3 :(得分:0)

Java始终将参数作为字符串类型...( String args [] ),因此您需要转换所需的类型。

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

示例:

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

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

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

答案 4 :(得分:0)

这是一个更简单的答案

Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x7f527104b6a8> Traceback (most recent call last): File "/home/ubuntu/django_env/lib/python3.5/site-packages/django/utils/autoreload.py", line 225, in wrapper fn(*args, **kwargs) File "/home/ubuntu/django_env/lib/python3.5/site-packages/django/core/management/commands/runserver.py", line 112, in inner_run autoreload.raise_last_exception() File "/home/ubuntu/django_env/lib/python3.5/site-packages/django/utils/autoreload.py", line 248, in raise_last_exception raise _exception[1] File "/home/ubuntu/django_env/lib/python3.5/site-packages/django/core/management/__init__.py", line 327, in execute autoreload.check_errors(django.setup)() File "/home/ubuntu/django_env/lib/python3.5/site-packages/django/utils/autoreload.py", line 225, in wrapper fn(*args, **kwargs) File "/home/ubuntu/django_env/lib/python3.5/site-packages/django/__init__.py", line 24, in setup apps.populate(settings.INSTALLED_APPS) File "/home/ubuntu/django_env/lib/python3.5/site-packages/django/apps/registry.py", line 112, in populate app_config.import_models() File "/home/ubuntu/django_env/lib/python3.5/site-packages/django/apps/config.py", line 198, in import_models self.models_module = import_module(models_module_name) File "/home/ubuntu/django_env/lib/python3.5/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 986, in _gcd_import File "<frozen importlib._bootstrap>", line 969, in _find_and_load File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 673, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 665, in exec_module File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed File "/home/ubuntu/Sg_Bus/SgBusTransport/models.py", line 10, in <module> class BusStop(models.Model): File "/home/ubuntu/Sg_Bus/SgBusTransport/models.py", line 17, in BusStop objects = models.GeoManager() AttributeError: module 'django.contrib.gis.db.models' has no attribute 'GeoManager'

答案 5 :(得分:0)

不是等效项,但是您可以使用扫描仪和模式来分析具有三个非负数并用空格分隔的行,例如:

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

答案 6 :(得分:0)

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

答案 7 :(得分:-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"
   }
}

您可以阅读更多here.