0

我只是在磨练我的 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: 

有人可以澄清这种情况吗?

4

4 回答 4

3

那是因为

System.in.read();

接收每个按下的键。也就是说,在您的情况下,“a”键和“return”键。

如果您想要您的功能,请使用以下内容:

Scanner scanner = new Scanner(System.in);

然后使用:

String line =(char)scanner.nextLine();

然后解析值。

于 2014-04-10T05:43:19.483 回答
2

您正在处理换行符,就好像它是合法输入一样。您应该阅读整行(包括换行符,可能使用 a Scanner),然后处理该行的第一个字符,或者简单地添加一个测试以跳过循环逻辑中的换行符。

PS 通过加或减 32 来转换大小写是一种非常糟糕的方法。除了 az 和 AZ(在英文字母表中)之外,它不能与任何东西一起使用。它不适用于 Basic Latin 块之外的大多数字符,并且根本不应该用于没有替代大小写的字符(例如换行符)。您应该使用Character.toUpperCase()andCharacter.toLowerCase()代替。

于 2014-04-10T05:42:11.253 回答
2

它循环了两次,因为它正在处理每个字符后面的换行符。

于 2014-04-10T05:42:12.503 回答
1

答案摘自《Java:初学者指南》一书

上面提到的答案也是正确的。只是为了更清楚,我会发布这个。

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 之前键入了多个键,它们也会仍然在输入缓冲区中。该循环通过继续读取输入来丢弃这些字符,直到到达行尾。如果它们没有被丢弃,那么这些字符也将作为猜测发送给程序,这不是我们想要的。(要查看这样做的效果,您可以尝试删除内部的 do-while 循环。)在第 10 章中,在您了解了更多有关 Java 的知识之后,将描述一些其他更高级别的处理控制台输入的方法。但是,这里使用 read() 可以让您深入了解 Java 的基础 s I/O 系统运行。它还显示了 Java 循环的另一个示例。

于 2017-04-11T16:29:48.510 回答