在转移到第二个语句之前,C#循环将第一个语句循环三次

Sta*_*s D 0 c# loops console-application do-while

我在C#的控制台应用程序中编写了这个do-while循环:

do 
{
    ThisHelp.ShowMenu();
    userChoice = (char) Console.Read();
    ThisHelp.Helpon(userChoice);
}while(ThisHelp.IsValid(userChoice) == false);
Run Code Online (Sandbox Code Playgroud)

该方法ThisHelp.ShowMenu()只有一堆Write + WriteLine方法,它们要求用户输入1到8的数字.该方法ThisHelp.Helpon()有一个开关,根据传递的用户输入,显示不同的文本.该方法ThisHelp.IsValid只检查用户输入是1到8之间的数字.

这是问题:在用户写入数字并按下ENTER后,循环的第一个语句在第二个语句至少执行一次之前执行3次.为什么会这样?

编辑:这是ThisHelp.IsValid方法的代码,如下所示:

public bool IsValid(char ch)
{
   if (ch < '1' | ch > 8 & ch != 'q') return false;
   else return true;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

Console.Read()通常只有在用户按下返回时才返回 - 此时回车和换行将通过后续调用返回Console.Read().您可以通过记录(或在调试器中检查)userChoice每次迭代的值来验证.

调用Console.ReadLine()哪个将消耗整行,然后将该值转换为整数可能更简单.


Ren*_*ogt 5

问题是Console.Read()返回用户输入的每个字符.所以,如果他进入8然后按回车,你得到三个大字:

  • 8
  • \r (回车)和
  • \n (新队)

你可能宁愿用这个:

char userChoice = Console.ReadLine().Trim()[0];
Run Code Online (Sandbox Code Playgroud)

但一定要为空输入添加一些错误处理.