我只是在磨练我的java技能,并且我写了这个代码来玩键盘输入和while循环。
package Chapter3;
import java.io.IOException;
public class convertCase {
public static void main(String args[]) throws IOException {
char ch = 'a';
do {
System.out.println("please type in a value: ");
ch = (char) System.in.read();
if((int) ch < 96) {
ch += 32;
int newCh = (int) ch;
System.out.println("The lowercase version is: " + (char)newCh);
}
else if((int) ch >96) {
System.out.println("You have typed in" + ch);
ch -= 32;
int newCh = (int) ch;
System.out.println("the uppercase version is: " + (char)newCh);
}
} while(ch!='.');
}
}
问题在于,当我测试它时,'while循环'在请求输入之前运行两次而不是仅仅一次:
please type in a value:
a
You have typed ina
the uppercase version is: A
please type in a value:
The lowercase version is: *
please type in a value:
L
The lowercase version is: l
please type in a value:
The lowercase version is: *
please type in a value:
有人能否澄清这种情况?
答案 0 :(得分:3)
那是因为
System.in.read();
接受按下的每个键。也就是说,在你的情况下,&#39; a&#39;关键,并且“返回”&#39;键。
如果您需要您的功能,请使用以下内容:
Scanner scanner = new Scanner(System.in);
然后使用:
String line =(char)scanner.nextLine();
然后解析值。
答案 1 :(得分:2)
您正在处理换行符,就好像它是合法输入一样。您应该读取整行(包括换行符,可能使用Scanner
),然后处理该行的第一个字符,或者只是添加一个测试以跳过循环逻辑中的换行符。
P.S。通过添加或减去32来转换案例是一种非常糟糕的方法。除了a-z和A-Z(英文字母)之外,它不会使用任何东西。它不适用于Basic Latin块之外的大多数字符,并且不应该用于没有备用情况的字符(例如换行符)。您应该使用Character.toUpperCase()
和Character.toLowerCase()
代替。
答案 2 :(得分:2)
它循环两次,因为它正在处理每个字符后面的换行符。
答案 3 :(得分:1)
答案取自Book&#34; Java:初学者指南&#34;
上面提到的答案也是正确的。为了进一步说明,我将发布此信息。
do {
System.out.print("Pres a key followed by Enter: ");
//get a char
ch = (char) System.in.read();
//REFERRING TO THIS PART
do{
ignoreNewLineENTER = (char) System.in.read();
}
while (ignoreNewLineENTER != '\n');
} while (ch != 'q');
控制台输入是行缓冲的 - 你必须在发送字符之前按ENTER键。按ENTER键将生成回车符和换行符(换行符)序列。这些字符在输入缓冲区中保持挂起状态。此外,如果在按ENTER之前键入多个键,它们仍然会在输入缓冲区中。此循环通过继续读取输入直到到达行的末尾来丢弃这些字符。如果它们没有被丢弃,那么这些字符也将作为猜测发送到程序,这不是想要的。 (要查看其效果,您可以尝试删除内部执行循环。)在第10章中,在您了解了有关Java的更多信息之后,将介绍一些其他更高级别的处理控制台输入的方法。但是,在这里使用read()可以让您深入了解Java I / O系统的基础如何运作。它还显示了Java循环的另一个例子。