在java中占用字符时出现一些逻辑错误

时间:2012-06-28 09:23:04

标签: java string-comparison

这是我的代码......

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

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

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:4)

h后按下了返回;在你这样做之前你不会 'h',但是你仍然会看到回归(从它的外观来看,它会以两个字符出现,可能是{{ 1}}和'\r')在看到下一个字符之前。

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

您可以使用'\n'Scanner包裹BufferedReader

答案 2 :(得分: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);
        }
    }