Yes/No 使用字符的菜单无法正常工作
Yes/No Menu Using Characters Doesn't Work Correctly
我正在尝试制作一个简单的菜单,您可以在其中 select 选择一个或另一个来继续。此菜单使用 "read" 或 "write" 作为两个选项,而不是 "yes" 或 "no",但概念当然是相同的。代码看起来像这样...
public void Start()
{
char selection;
do
{
Console.WriteLine("Would you like to read (r) or write (w) to a file?");
selection = (char) Console.Read();
} while (selection != 'r' || selection != 'w');
}
现在,当您输入 'r' 或 'w' 时,这不仅不会停止循环,而且会在您之后随时按回车键后输入 3 行 WriteLine 文本。
任何人都可以阐明如何解决这个问题吗?我假设我不正确地使用了 Read() 方法,但作为新手,我发现很难通过一些事情简单地反复试验。任何帮助都将是惊人的。提前谢谢你。
编辑
public void Start()
{
char selection = 'y';
while(selection == 'y')
{
Console.Write("Would you like to continue...");
selection = (char)Console.Read();
Flush();
}
}
public void Flush()
{
while(Console.In.Peek() != -1)
{
Console.In.Read();
}
}
Console.Read() 会给你输入的字符。一旦他们输入 'r' 就会停止。那不是你想要的吗?
按 ENTER 实际上会生成 2 个字符,因此它会再打印 2 次提示。
也许你只是想要这个:
public void Start()
{
char selection;
Console.WriteLine("Would you like to read (r) or write (w) to a file?");
do
{
selection = (char) Console.Read();
} while (selection != 'r' && selection != 'w');
}
selection != 'r' || selection != 'w'
始终为真。如果 selection
是 r
,则 selection != 'w'
部分为真,如果 selection
不是 r
,则 selection != 'r'
部分为真,所以你要么 false || true
(这是真的),要么 true || ...
(后一个操作数无关紧要)这也是真的。
你可能想要 while (selection != 'r' && selection != 'w')
.
解决您的问题的另一种方法是使用 break 调用中断循环,然后 return 插入的值。
示例:
class Program
{
static void Main(string[] args)
{
char selection = read_or_write();
Console.WriteLine("char in main function: "+selection);
Console.WriteLine("press enter to close");
Console.ReadLine(); //clean with enter keyboard
}
public static char read_or_write()
{
char selection;
Console.WriteLine("Would you like to read (r) or write (w) to a file?");
do
{
selection = (char)Console.Read();
Console.ReadLine();//clean with enter keyboard
if (selection == 'r')
{
Console.WriteLine("You pressed r");
break;
}
else if (selection == 'w')
{
Console.WriteLine("You pressed w");
break;
}
else
{
Console.WriteLine("You pressed a wrong key!");
}
} while (selection != 'r' || selection != 'w');
return selection;
}
}
我正在尝试制作一个简单的菜单,您可以在其中 select 选择一个或另一个来继续。此菜单使用 "read" 或 "write" 作为两个选项,而不是 "yes" 或 "no",但概念当然是相同的。代码看起来像这样...
public void Start()
{
char selection;
do
{
Console.WriteLine("Would you like to read (r) or write (w) to a file?");
selection = (char) Console.Read();
} while (selection != 'r' || selection != 'w');
}
现在,当您输入 'r' 或 'w' 时,这不仅不会停止循环,而且会在您之后随时按回车键后输入 3 行 WriteLine 文本。
任何人都可以阐明如何解决这个问题吗?我假设我不正确地使用了 Read() 方法,但作为新手,我发现很难通过一些事情简单地反复试验。任何帮助都将是惊人的。提前谢谢你。
编辑
public void Start()
{
char selection = 'y';
while(selection == 'y')
{
Console.Write("Would you like to continue...");
selection = (char)Console.Read();
Flush();
}
}
public void Flush()
{
while(Console.In.Peek() != -1)
{
Console.In.Read();
}
}
Console.Read() 会给你输入的字符。一旦他们输入 'r' 就会停止。那不是你想要的吗? 按 ENTER 实际上会生成 2 个字符,因此它会再打印 2 次提示。 也许你只是想要这个:
public void Start()
{
char selection;
Console.WriteLine("Would you like to read (r) or write (w) to a file?");
do
{
selection = (char) Console.Read();
} while (selection != 'r' && selection != 'w');
}
selection != 'r' || selection != 'w'
始终为真。如果 selection
是 r
,则 selection != 'w'
部分为真,如果 selection
不是 r
,则 selection != 'r'
部分为真,所以你要么 false || true
(这是真的),要么 true || ...
(后一个操作数无关紧要)这也是真的。
你可能想要 while (selection != 'r' && selection != 'w')
.
解决您的问题的另一种方法是使用 break 调用中断循环,然后 return 插入的值。 示例:
class Program
{
static void Main(string[] args)
{
char selection = read_or_write();
Console.WriteLine("char in main function: "+selection);
Console.WriteLine("press enter to close");
Console.ReadLine(); //clean with enter keyboard
}
public static char read_or_write()
{
char selection;
Console.WriteLine("Would you like to read (r) or write (w) to a file?");
do
{
selection = (char)Console.Read();
Console.ReadLine();//clean with enter keyboard
if (selection == 'r')
{
Console.WriteLine("You pressed r");
break;
}
else if (selection == 'w')
{
Console.WriteLine("You pressed w");
break;
}
else
{
Console.WriteLine("You pressed a wrong key!");
}
} while (selection != 'r' || selection != 'w');
return selection;
}
}