为什么我必须两次清除缓冲区才能获得正确的输出?

Why do I have to clear buffer twice for getting correct output?

昨天才开始学习Java,今天学习输入法。我知道为什么我们需要在使用 .nextInt() 之后使用 .nextLine() 进行输入之前清除扫描仪缓冲区,但是我注意到一件事,如果我在从 [=12= 进行输入之前删除打印语句].我不得不使用 .nextLine() 两次而不是一次来删除缓冲区,否则它不会按预期工作。

我的初始代码是这样的:

Scanner sc = new Scanner(System.in);
System.out.println("Enter the number :");
int num = sc.nextInt();
sc.nextLine();
System.out.println("Enter the string :");
String str = sc.nextLine();
System.out.println(num);
System.out.println(str);

因此,如果我在获取输入字符串并将其存储在变量 str 之前删除打印语句,即使我删除了缓冲区,它也会再次将值 \n 传递给该变量之前使用 .nextLine()

当前代码:

Scanner sc = new Scanner(System.in);
System.out.println("Enter the number :");
int num = sc.nextInt();
sc.nextLine();
sc.nextLine();
String str = sc.nextLine();
System.out.println(num);
System.out.println(str);

理想情况下,打印语句不应该对扫描仪缓冲区产生任何影响,对吧?那么,为什么要跳过它?

此外,既然我已经删除了缓冲区,那么为什么它再次将值 \n 传递给我的变量 str 除非我删除缓冲区两次或之前传递 print 语句接受输入。

我尝试用谷歌搜索它,并尝试在 YouTube 和此处进行大量搜索,但 none 的解决方案实际上讨论了我现在面临的这个问题。

这不是打印语句或“缓冲区”的问题。

你看,nextInt() 方法留下了一个换行符,即 \n 在输入中悬空。
因此,即将到来的 nextLine() 方法选择此 \n 作为输入,因此,您必须添加另一个 nextLine() 来捕获实际的字符串输入。

解法:
反而, 使用 Integer.parseInt(sc.nextLine()) 获取 int 值并使用普通 sc.nextLine() 获取字符串输入。

或者在 nextLine() 获取实际输入之前添加 nextLine() 来消耗这个额外的 \n。

这完全是一个解释错误,是在输入时造成的。

在您 运行 编写您的代码时,您 运行 它在您最喜欢的 IDE 中。你们中的一个(你或 IDE)无意中根据光标在控制台上的位置在末尾添加了另一个 '\n' 字符。这会导致扫描仪将其读取为另一行。您也可以通过键盘上的箭头键(上、下、左、右)移动光标。

好的,但是为什么System.out.println();解决了问题?

因为它会将您的光标移动到正确的位置。

使用不同的IDE,你会发现这个问题不会发生。