C# 循环将第一条语句循环三次,然后再转到第二条语句

C# 循环将第一条语句循环三次,然后再转到第二条语句,c#,loops,console-application,do-while,C#,Loops,Console Application,Do While,我在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.

我在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之间的数字

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

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

public bool IsValid(char ch)
{
   if (ch < '1' | ch > 8 & ch != 'q') return false;
   else return true;
}
Console.Read通常仅在用户按下return时返回-此时,回车符和换行符也将通过对Console.Read的后续调用返回。您可以通过在调试器中记录或检查每次迭代的userChoice值来验证这一点

调用Console.ReadLine可能更简单,它将占用整行,然后将该值转换为整数。

问题在于Console.Read返回用户输入的每个字符。因此,如果他输入8,然后按ENTER键,您将得到三个字符:

8. \r车厢返回和 \新线 你可以用这个:

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

但请确保为空输入添加一些错误处理。

您可以尝试将循环的后两行放在一行中。试着这样做:

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

您应该使用int.ParseConsole.ReadLine而不是char Console.read在执行ThisHelp.HelponuserChoice之前不必验证输入;方法?@DCruz22如果用户输入无效字符,则ThisHelponuserChoice;方法不会输出任何内容,并且执行将按照预期跳出循环。我可以用另一种方式来做,但是这个练习需要我使用do while循环,所以我就这样做了。谢谢,这很有效。但我接受了另一个答案,因为它同样有效,但击键次数较少。例如,我必须将方法的参数declaration也从type char更改为int。。。