C# loop 在移动到第二个语句之前循环第一个语句三次

C# loop loops the first statement three times before moving to the second statement

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

do 
{
    ThisHelp.ShowMenu();
    userChoice = (char) Console.Read();
    ThisHelp.Helpon(userChoice);
}while(ThisHelp.IsValid(userChoice) == false);

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

问题来了:用户输入一个数字并按下回车后,循环的第一条语句执行了3次,第二条语句至少执行了一次。为什么会这样?

编辑:这是 ThisHelp.IsValid 方法的代码,应要求:

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

Console.Read() 通常只有 returns 当用户按下 return - 此时回车 return 和换行也会 由对 Console.Read() 的后续调用 return 编辑。您可以通过在每次迭代中记录(或在调试器中检查)userChoice 的值来验证这一点。

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

问题是 Console.Read() returns 用户输入的每个字符。所以如果他输入 8 然后按 ENTER 你会得到三个字符:

  • 8
  • \r(回车return)和
  • \n(换行)

你可能更愿意使用这个:

char userChoice = Console.ReadLine().Trim()[0];

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

您可以尝试将循环的后两行合二为一。尝试这样的事情:

ThisHelp.Helpon(Char.Parse(Console.Readline()));