我正在使用Java来解释一些输入。我正在使用BufferedReader。我的目标是在读取char后读取一定数量的行,其中-1是stop命令。像这样的东西
2
CASE 1 - L1
CASE 1 - L2
3
CASE 2 - L1
CASE 2 - L2
CASE 2 - L3
-1
我的目标只是输出:
CASE 1 - L1
CASE 1 - L2
CASE 2 - L1
CASE 2 - L2
CASE 2 - L3
这意味着我能以正确的方式获得这些线条。我的代码如下:
public class TESTE {
public static void main(String[] args) throws IOException {
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
int state;
while ((state = buffer.read()) != 45) {
char c = (char) state;
if (Character.isDigit(c)) {
int n = Character.getNumericValue(c);
for (int i = 0; i < n; ++i) {
System.out.println("L:" + buffer.readLine());
System.out.println();
}
}
}
}
}
出于某种原因,我的输出是:
L:
L:CASE 1 - L1
L: - L2
L:
L:CASE 2 - L1
L:CASE 2 - L2
L: - L3
我做错了什么?是否有一种优雅的方式来处理输入?
答案 0 :(得分:0)
在for
循环中,您有buffer.readline()
。因此,您基本上可以一次性读取所有行(而我认为您希望逐行读取)。
您可能希望使用功能readLine()
来简化代码,例如。当到达输出结束时,它返回null
。这将允许您消除有点笨拙的-1
指示输入结束。
String line;
while ((line = buffer.readLine()) != null) {
if (!Character.isDigit(line.charAt(0)) {
System.out.println("L:" + line);
}
}
答案 1 :(得分:0)
全面的答案可以如下,这将符合您的目的。请注意,如果考虑整数,而不是考虑单个数字,那么它会更好,因为该值可能大于9.在这种情况下,考虑单个字符就不够了!
public static void main(String[] args) throws IOException {
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = buffer.readLine()) != null) {
int value;
try {
value = Integer.parseInt(line); // if user gives non-integer values as input
} catch (NumberFormatException ex) {
System.out.println("Error!");
continue; // print error message and then continue
}
if (value == -1) {
break;
}
for (int i = 0; i < value; i++) {
line = buffer.readLine(); // keep asking for input from user
System.out.println("L:" + line);
}
}
}
答案 2 :(得分:0)
发生了什么事。
buffer.read()
返回50
'2'
n
,即2
现在缓冲区中的下一步是什么? \n
之后的'2'
!这就是你获得第一个输出的原因
L:
空行。
没有必要继续下去。整个过程都被打破了。
一种方法:
Scanner in = new Scanner(System.in);
while (true) {
int n = Integer.parseInt(in.nextLine());
if (n == -1) break;
for (int i = 0; i < n; i++) {
System.out.println("L:" + in.nextLine());
}
}