11

我是 C# 的新手,我已经开始学习它以扩大我可以使用的编程语言,但我遇到了一个小问题,我在 C 和 Java 中都没有遇到过。

我试图从键盘获得用户响应,然后将其与可能的情况进行比较,如果这些情况都不匹配,那么我希望用户必须重复该过程,直到他输入了正确的值。

String input = Console.ReadLine();

while ((input[0] != 'N') || (input[0] != 'Y'))
    input = Console.ReadLine();       
if (input[0] == 'N')
{
    Console.WriteLine("NO");
    Console.ReadKey();
}
else if (input[0] == 'Y')
{
    Console.WriteLine("YES");
    Console.ReadKey();
} 

到目前为止,这不是我尝试过的最有效的方法,我也尝试过做一个 do while 循环和许多其他变体。

我遇到的问题是,当没有激活​​while循环时,一切正常,但是当我添加它时,即使输入是N或Y,它也总是进入循环并且永远不会离开循环,即使很明显这是错误的。

请如果有人能给我一些关于为什么会发生这种情况的见解,或者如果有人可以提出更好的方法来做到这一点,我们将不胜感激。谢谢你。

卡里姆

4

5 回答 5

11

现在,您的 while 语句中的条件将始终为真。对此进行测试的一个好方法是在正在测试 while 循环的地方放置一个断点,然后对条件的每个部分“添加监视”。

改变

while ((input[0] != 'N') || (input[0] != 'Y'))

while ((input[0] != 'N') && (input[0] != 'Y'))
于 2012-12-22T06:11:47.477 回答
4

正如每个人已经指出的那样,您正在使用||应该使用的地方&&

除此之外,您还尝试访问可能为空的字符串的第一个字符。如果用户只是按“Enter”,这将导致异常。

由于您要求更好的方法,这里有一个替代方法,它使用Console.ReadKey而不是Console.ReadLine,因为您似乎只对获得一个角色感兴趣。它还具有不区分大小写的优点。

while (true)
{
    ConsoleKeyInfo key = Console.ReadKey();
    Console.WriteLine(""); // Just for nice typesetting.

    if (key.Key == ConsoleKey.N)
    {
        Console.WriteLine("NO");
        break;
    }

    if (key.Key == ConsoleKey.Y)
    {
        Console.WriteLine("YES");
        break;
    }
}
于 2012-12-22T06:28:04.240 回答
1

问题在于条件检查。

while ((input[0] != 'N') || (input[0] != 'Y'))

假设输入了“N”。现在条件(input[0] != 'Y')变为,它应该跳出while循环但是因为|| 保持(input[0] != 'N'),条件的最终结果为,因此它永远不会跳出循环。

替换|| &&

于 2012-12-22T06:16:01.777 回答
1

试试这个:-

String input = Console.ReadLine();
        while ((input[0] != 'N') && (input[0] != 'Y'))
        {
            input = Console.ReadLine();

        }
        if (input[0] == 'N')
        {
            Console.WriteLine("NO");
            Console.ReadKey();
        }
        else if (input[0] == 'Y')
        {
            Console.WriteLine("YES");
            Console.ReadKey();
        }
于 2012-12-22T06:16:36.010 回答
0

那么你的情况就是问题所在。您的两个条件是 Ored ,这意味着如果其中一个条件为真,则循环将执行。所以你首先或条件而不是像 !(condition1 || condition2) 这样的结果,如下所示

        String input = Console.ReadLine();

        while (!((input[0] != 'N') || (input[0] != 'Y')))
        {
            input = Console.ReadLine();
        }

        if (input[0] == 'N')
        {
            Console.WriteLine("NO");
            Console.ReadKey();
        }

        else if (input[0] == 'Y')
        {
            Console.WriteLine("YES");
            Console.ReadKey();
        } 
于 2012-12-22T06:15:38.717 回答