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

问题描述 投票:0回答:2

昨天刚开始学Java,今天学的是input-taking。我知道为什么我们需要在使用

.nextLine()
之后使用
.nextInt()
接受输入之前清除扫描仪缓冲区,但是我注意到一件事,如果我在从
.nextLine()
接受输入之前删除打印语句。我不得不使用
.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
除非我两次删除缓冲区或在获取输入之前传递打印语句。

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

java buffer java.util.scanner
2个回答
1
投票

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

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

好的,但为什么

System.out.println();
解决了问题?

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

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


-1
投票

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

你看,

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.