C#我的while循环重复3次,然后提示进行其他选择
我不熟悉C语言,但我对Java相当了解。我可能会错过一些简单的东西,我只是不知道,因为是新的这种特殊的语言。我正在尝试创建一个while循环,该循环会一直重复,直到用户选择Q为止。该循环可以很好地退出,但其中的代码会在停止之前重复3次,以提示用户进行选择。为什么会发生这种情况C#我的while循环重复3次,然后提示进行其他选择,c#,while-loop,C#,While Loop,我不熟悉C语言,但我对Java相当了解。我可能会错过一些简单的东西,我只是不知道,因为是新的这种特殊的语言。我正在尝试创建一个while循环,该循环会一直重复,直到用户选择Q为止。该循环可以很好地退出,但其中的代码会在停止之前重复3次,以提示用户进行选择。为什么会发生这种情况 class MainClass { public static void DisplayMenu() { Console.WriteLine("What would you like to do
class MainClass
{
public static void DisplayMenu() {
Console.WriteLine("What would you like to do?");
Console.WriteLine("(D)eposit");
Console.WriteLine("(W)ithdraw");
Console.WriteLine("(C)alculateInterest");
Console.WriteLine("(S)howBalance");
Console.WriteLine("(Q)uit");
Console.WriteLine("************************************");
Console.WriteLine("Make choice by entering first letter of choice,");
Console.WriteLine("then press ENTER key:");
}
static void Main(string[] args) {
Account account = new Account();
char choice;
double amount = 0.0;
Console.WriteLine("************************************");
Console.WriteLine("Welcome to Bernard's Bodacious Bank!");
Console.WriteLine("************************************");
Console.WriteLine("We have opened your account");
DisplayMenu();
choice = Char.ToUpper((char)Console.Read());
while (!choice.Equals('Q')) {
DisplayMenu();
choice = Char.ToUpper((char)Console.Read());
}
account.ShowTransactions();
Console.ReadKey();
}
}
原因可能是您正在使用
Console.Read()
,它将处理输入流中的下一个字符,其中包括用户按下Enter
时的\n
和\r
字符。然后,在调用Console.Read()
时,这些字符会立即在循环中处理
如果只需要一个字符,可以使用Console.ReadKey()
,它返回用户键入的第一个键(类型为ConsoleKeyInfo
)。然后可以对其键
属性进行比较,如:
Console.WriteLine("************************************");
Console.WriteLine("Welcome to Bernard's Bodacious Bank!");
Console.WriteLine("************************************");
Console.WriteLine("We have opened your account");
double amount = 0.0;
ConsoleKeyInfo choice;
do
{
DisplayMenu();
choice = Console.ReadKey();
} while (choice.Key != ConsoleKey.Q);
或者,如果您不想让他们按enter键,那么您应该使用
控制台.ReadLine()
方法,并检查它启动时使用了什么:
DisplayMenu();
string choice = Console.ReadLine();
while (!choice.StartsWith("Q", StringComparison.OrdinalIgnoreCase))
{
DisplayMenu();
choice = Console.ReadLine();
}
下面是一个如何处理输入的示例。它假设您有可以为每个选项调用的方法:
var quit = false;
while(!quit)
{
DisplayMenu();
var choice = Console.ReadKey();
switch (choice.Key)
{
case ConsoleKey.D:
Deposit();
break;
case ConsoleKey.W:
Withdrawl();
break;
case ConsoleKey.C:
CalcInterest();
break;
case ConsoleKey.S:
ShowBalance();
break;
case ConsoleKey.Q:
quit = true;
break;
default:
Console.WriteLine("Invalid entry, try again");
break;
}
}
原因可能是您正在使用Console.Read()
,它将处理输入流中的下一个字符,其中包括用户按下Enter
时的\n
和\r
字符。然后,在调用Console.Read()
时,这些字符会立即在循环中处理
如果只需要一个字符,可以使用Console.ReadKey()
,它返回用户键入的第一个键(类型为ConsoleKeyInfo
)。然后可以对其键
属性进行比较,如:
Console.WriteLine("************************************");
Console.WriteLine("Welcome to Bernard's Bodacious Bank!");
Console.WriteLine("************************************");
Console.WriteLine("We have opened your account");
double amount = 0.0;
ConsoleKeyInfo choice;
do
{
DisplayMenu();
choice = Console.ReadKey();
} while (choice.Key != ConsoleKey.Q);
或者,如果您不想让他们按enter键,那么您应该使用控制台.ReadLine()
方法,并检查它启动时使用了什么:
DisplayMenu();
string choice = Console.ReadLine();
while (!choice.StartsWith("Q", StringComparison.OrdinalIgnoreCase))
{
DisplayMenu();
choice = Console.ReadLine();
}
下面是一个如何处理输入的示例。它假设您有可以为每个选项调用的方法:
var quit = false;
while(!quit)
{
DisplayMenu();
var choice = Console.ReadKey();
switch (choice.Key)
{
case ConsoleKey.D:
Deposit();
break;
case ConsoleKey.W:
Withdrawl();
break;
case ConsoleKey.C:
CalcInterest();
break;
case ConsoleKey.S:
ShowBalance();
break;
case ConsoleKey.Q:
quit = true;
break;
default:
Console.WriteLine("Invalid entry, try again");
break;
}
}
从MSDN文档中:
当您键入输入字符时,Read方法阻止其返回;当您按Enter键时,它终止。按Enter键将平台相关的线路终止序列附加到输入中(例如,Windows附加回车换行序列)。对Read方法的后续调用一次检索一个字符的输入。检索到最后一个字符后,Read将再次阻止其返回,循环将重复
在Windows中,“平台相关线路终止序列”等于\r\n
。因此,当您键入A
,然后输入时,实际上是在为您的程序发送3次按键以进行处理
另请参阅MSDN文档:
ReadLine方法或KeyAvailable属性和ReadKey方法优于使用Read方法
从MSDN文档中:
当您键入输入字符时,Read方法阻止其返回;当您按Enter键时,它终止。按Enter键将平台相关的线路终止序列附加到输入中(例如,Windows附加回车换行序列)。对Read方法的后续调用一次检索一个字符的输入。检索到最后一个字符后,Read将再次阻止其返回,循环将重复
在Windows中,“平台相关线路终止序列”等于\r\n
。因此,当您键入A
,然后输入时,实际上是在为您的程序发送3次按键以进行处理
另请参阅MSDN文档:
ReadLine方法或KeyAvailable属性和ReadKey方法优于使用Read方法
这似乎是最简单的答案,使用read key方法,然后使用choice.key和ConsoleKey.Q。谢谢大家的帮助!它为我指明了正确的方向
静态void Main(字符串[]参数){
这似乎是最简单的答案,使用read-key方法,然后使用choice.key和ConsoleKey.Q。谢谢大家的帮助!它为我指明了正确的方向
静态void Main(字符串[]参数){
可能是某个地方引发了未处理的异常。您可以添加try/catch块或附加调试器,并确保它捕获所有clr异常。如果您告诉他们按enter键,则应使用Console.ReadLine()。此外,由于您重新绘制了菜单,您可能希望在他们按enter键后清除屏幕。可能是某个地方引发了未处理的异常。您可以添加try/catch块或附加调试器,并确保它捕获所有clr异常。如果您告诉他们按enter键,则应使用Console.ReadLine()。另外,您可能希望在他们按enter键后清除屏幕,因为您重新绘制了菜单。我认为这句话不正确:“原因可能是您使用的是Console.Read(),它将返回整行…”Console.Read()的MSDN文档表示它返回输入流中的下一个字符。是的,它将一直阻止,直到用户点击Enter键,但每个调用只返回一个字符,而不是整行。您是对的,让我尝试更正。整行将成为输入流的一部分,但Read()
只处理一个字符。我想是这样的。然后我需要将choice字符用于循环中的一个switch case中。使用readkey的do-while使它比应该的复杂得多。我也不确定我是否可以使用它。我让某人使用一个银行帐户,所以我需要让switch statement我不能根据输入的第一个字符来决定。如果s