繁体   English   中英

扫描仪 nextInt() 与 nextLine() 从控制台读取……为什么我可以在没有 nextLine() 的情况下使用 nextInt()?

[英]Scanner nextInt() vs nextLine() reading from console … why can I use nextInt() without nextLine()?

在单独的行中将数字输入控制台时,为什么我不必使用 nextLine? 我希望控制台解释每行的结尾有 \\n 但无论我在每个 nextInt() 之后使用 nextLine() 还是程序的工作方式都是一样的。 使用 Eclipse。

// Example used
10 5      // # lines to read ,  divisor
22        //  if # divisible by divisor, count++ 
15 
10 
25 
17 
13 
15 
10 
7 
9 

public static void main(String[] args) {
    Scanner keyboard = new Scanner(System.in);
    int n = getNumber(keyboard);
    int k = getNumber(keyboard);
    int numLinesPassed = getNumberPassCriteria(keyboard, n, k);
    System.out.println("# Passed: " + numLinesPassed);
}
    
public static int getNumber(Scanner keyboard) {
    return keyboard.nextInt();
}
    
public static int getNumberPassCriteria(Scanner keyboard, int n, int k) {
    int counter = 0;

    for(int i = 0; i < n; i++) {
        int value = keyboard.nextInt();
        if (value % k == 0) {
            counter++;
        }
        //keyboard.nextLine();    not understand why I don't need this 
    }

    return counter;
}

因为Scanner的默认分隔符是这种模式

\p{javaWhitespace}+

(注意:这个确切的模式没有明确记录,但是当你在没有明确指定不同的分隔符的情况下实例化一个Scanner时,它是你调用delimiter()方法获得的结果)

编辑

根据user15244370的建议,我所做的这些乱七八糟的参考实际上直接记录在此处Scanner文档中。 您可以直接跳到下面的列表。


该模式的含义记录在Pattern类的文档中,该类本身引用了Character.isWhitespace方法该模式意味着至少一个序列

  • Unicode 空格字符(SPACE_SEPARATOR、LINE_SEPARATOR 或 PARAGRAPH_SEPARATOR)但也不是不间断空格('\ '、'\ '、'\ ')。 *'\\t', U+0009 水平制表。
  • '\\n', U+000A 换行符。
  • '\ ',U+000B 垂直制表。
  • '\\f', U+000C 换页。
  • '\\r', U+000D 回车。
  • '\', U+001C 文件分隔符。
  • '\', U+001D 组分隔符。
  • '\', U+001E 记录分隔符。
  • '\', U+001F 单位分隔符。

其中包括换行符(第二个要点)。

可能与Scanner 在使用 next() 或 nextFoo() 后跳过 nextLine()混淆 .

如果您正在阅读或尝试使用nextLine阅读数字后的下一行,这只是一个问题。

为什么? nextInt读取一个标记,定义为分隔符之间文本(默认空格包括换行符和回车符),这意味着,如果输入以一个或多个分隔符开头,则忽略(丢弃)。 nextLine不读取标记,它只是读取到换行符; 所以如果下一个字符是换行符,则返回一个空字符串。

易于测试:只需在数字之间输入几个空行 - 您的代码应该可以毫无问题地读取它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM