此代码使用NextRine()方法循环字符串两次,但使用next()方法仅循环一次



代码似乎跳过了第一个"Next.Line(("然后直接进入第二个。以下是它运行时会发生的情况。感谢

import java.util.*;
public class PrintWriter {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scn = new Scanner(System.in);
System.out.println("Would you like to enter some names?");
String response = scn.next();
int namecount = 1;
String name;


if (response.equals("yes") || response.equals("Yes") || response.equals("Yes"))
{
System.out.println("How many names would you like to enter?");

for (int nameresponse = scn.nextInt(); namecount <= nameresponse; ++namecount)
{
System.out.println("Please enter the name of name #" + namecount );
name = scn.nextLine();
}



}
}
}

nextLine()完全按照它的javadoc所说的去做,这不是你认为它会做的。扫描仪的最佳用途如下:

  • 从不调用nextLine-只调用所有其他方法(next()nextInt()等(
  • 只调用nextLine,不调用所有其他方法

显然,考虑到读取整数有时很好,第一个选择是上级。

对于键盘输入,也就是扫描仪通常使用的功能,最好的使用方法是将其设置为实际执行大多数人认为的操作——输入由用户输入,用户通过点击回车键完成任何输入。

为此,在new Scanner之后立即写入:

scanner.useDelimiter("\R");

这是java ese的意思:";输入由换行符"定界;并且可以在任何平台上工作。现在,要读取整数,请运行.nextInt()。要读取文本,请运行.next()(读取整行的值(。幸运的是,没有办法读懂"一个词"——这个词很少出现。好处:避免了nextLine和所有其他next方法之间的奇怪交互,用户现在可以输入空白输入(如果用户只点击回车键,.next()将返回一个空字符串,而如果在默认配置中使用scanner,则根本不起作用(。

但为什么呢

scanner通过扫描分隔符并返回分隔符之间的内容来"标记"输入。开箱即用,分隔符配置为"1个或多个空白符号"。这意味着next()将读取一个单词,也意味着不可能读取零长度输入(因为只需点击回车键就是添加越来越多的空白,您只需继续键入更多相同的分隔符(。两者都不方便,因此,我们不希望这样。

每当您"消费"一个令牌时(任何next()方法都会这样做(,"光标"现在位于令牌的末尾和后面的分隔符的开头:如果用户输入了一个名称,然后点击回车键,则我们在回车键的开始,就在它之前。

然后调用nextLine(),这是一个完全不同的功能,它完全忽略了这种"标记"one_answers"分隔符"业务,只返回所有内容,直到换行符为止。假设下一个符号是换行符,则返回一个空字符串

一个非常常见但很糟糕的解决方案是,在每次调用任何非nextLinenext方法后,只调用scanner.nextLine(),忽略结果。然而,如果你这样做,当用户按下键盘上最大的键——空格键时,一切都会进入手板。所以不要这样做,打电话给.useDelimiter("\R"),忘记.nextLine()

您需要使用scn.nextLine((而不是scn.next…next只读取一个单词,直到出现空格并终止到下一步,而nextLine则考虑完整的一行。

相关内容

  • 没有找到相关文章

最新更新