0

这是我的代码...

class info{
    public static void main (String[]args) throws IOException{
        char gen;

        while(true) {   //problem occurs with this while
            System.out.print("\nENTER YOUR GENDER (M/F) : ");
            gen=(char)System.in.read();

            if(gen=='M' || gen=='F' || gen=='m' || gen=='f'){
                break;
            }
        }

        System.out.println("\nGENDER = "+gen);
    }
}

这是我的输出...

ENTER YOUR GENDER (M/F) : h

ENTER YOUR GENDER (M/F) :
ENTER YOUR GENDER (M/F) :
ENTER YOUR GENDER (M/F) : m

GENDER = m

有人可以帮我理解为什么它这么多次要求性别。

4

3 回答 3

5

您可能正在 Windows 上工作。当您给出答案并按 Enter 时,它会添加两个额外的字符'\r''\n'. stdin您只收到一个字符,但额外的两个字符仍保留在缓冲区中。当您给出不正确的答案时,您会循环并自动从缓冲区中读取这两个字符。它们与性别不匹配,因此循环继续。最好的解决方案是分析字符串而不是字符:

InputStreamReader converter = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(converter);
String s = in.readLine();

请记住使用equals方法而不是==字符串比较。

于 2012-06-28T09:25:43.670 回答
4

按下后你按下回车h;在你这样做之前你不会看到'h',但是在你看到下一个字符之前你仍然会看到返回(从它的外观上看,这可能是两个字符,可能是'\r''\n')。

您可能希望一次读取一行文本,而不是单个字符 - 您只会在用户按下 return 时看到输入,这意味着您无需担心这个特定方面。

您可以Scanner为此使用,也可以使用BufferedReaderwrapping System.in

于 2012-06-28T09:25:33.883 回答
0

采用Scanner scan = new Scanner(System.in)

这是您的代码的工作版本....

public class Info{


        public static void main (String[]args) throws IOException{

        char gen;
            Scanner scan = new Scanner(System.in);          // Change made here

            while(true) {  

                System.out.print("\nENTER YOUR GENDER (M/F) : ");

                gen= scan.next().charAt(0);             // Change made here

                if(gen=='M' || gen=='F' || gen=='m' || gen=='f'){
                    break;
                }
                else{                                 // Change made here
                    System.out.println();
                    System.out.println("Your Option is not Available, pls try again");
                    continue;
                }
            }

            System.out.println("\nGENDER = "+gen);
        }
    }
于 2012-06-29T03:14:13.910 回答