在java中使用字符时的一些逻辑错误
这是我的密码在java中使用字符时的一些逻辑错误,java,string-comparison,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.i
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
有人能帮我理解为什么它多次询问性别。您在按下
h
后按下了return;在这样做之前,您不会看到'h'
,但在看到下一个字符之前,您仍然会看到返回(从外观上看,返回的字符可能是两个字符,可能是'\r'
和'\n'
)
您可能希望一次读取一行文本,而不是单个字符-您只会在用户按return键时看到输入,这意味着您不需要担心这一特定方面
您可以使用
Scanner
或BufferedReader
包装系统。在中,您可能正在Windows上工作。当您给出答案并按enter键时,它会额外添加两个字符'\r'
和'\n'
。从stdin
只能接收一个字符,但多余的两个字符仍保留在缓冲区中。当您给出错误的答案时,您将循环并自动从缓冲区读取这两个字符。他们不匹配的性别,所以循环继续。最好的解决方案是分析字符串而不是字符:
InputStreamReader converter = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(converter);
String s = in.readLine();
请记住在字符串比较中使用equals
方法而不是=
。使用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);
}
}
您可以编辑您的问题(问题下方的链接)以添加代码,而不是将其作为注释发布-这样看起来会更好!好啊thanx。。。事实上,我也是新手。谢谢你。。。在这里,我还必须添加一些包吗?你能解释一下这两个字符自动添加的原因吗?每个字符(甚至不可打印)都有自己的字节表示。其中一些(人们经常使用)也有它们的助记符号。例如,新行是\n
,选项卡是\t
等。当应用程序读取您的输入并按enter键时,它将接收“text\n”。在Windows中,自动添加\n
之前的\r
。所以您有:“text\r\n”。当您一个字符接一个字符地阅读消息时,您必须记住这些字符也是作为输入添加的。键入“h”时,输入缓冲区中的实际内容是“h\r\n”。您在char之后读取缓冲区中的char,因此在“h”之后将得到\r
和\n
。您可以使用break label帮助我完成上面编写的代码吗?。。。详细信息已经在那里给出了…@HimanshuAggarwal:使用新扫描仪(System.in)
然后从中读取行。好的。。。我明白了,谢谢。。。事实上,我知道从方法nextLine()输入字符串的方法,但不知道哪个方法会占用字符。。。在这件事上你能帮我吗???先生,有一个小小的疑问,为什么我们在Scanner构造函数中将System.in作为参数传递,为什么我们不将其留空?我知道从方法nextLine()输入字符串的方法,但不知道任何方法,因为它占用了字符。。。在这件事上你也能帮我吗?