【问题标题】:While Loop that doesn't keep looping不继续循环的while循环
【发布时间】:2014-03-11 10:15:36
【问题描述】:

对于初学者练习,我正在尝试创建一个简单的循环,该循环接受来自用户的单个字符,将该字符打印到控制台并一直这样做,直到用户输入“R”。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SimpleLoop
{
    class Program
    {
        static void Main(string[] args)
        {
            char cplayerSelection = 'R';

            while(cplayerSelection == 'R')
            {
                Console.WriteLine("Enter R, P, or S:");
            cplayerSelection = (char)Console.Read();
            Console.WriteLine(cplayerSelection);
            }
        }

    }
}

无论用户输入什么,它只会循环一次结束然后退出。我需要更改什么才能继续循环?

【问题讨论】:

  • 你可以试试 Console.ReadKey()
  • @SamLeach:不,他想要 ==。你读过他的问题吗?实际文字?他在哪里描述了他想要什么?
  • @ColinDeClue,是的。也许你应该重新阅读它?循环退出条件是“'R'以外的字符”。它不会循环,因为除了 'R' 之外的任何东西都会退出循环。
  • @SamLeach 这是他想要的,但是当输入“R”时,上面的代码也会退出。

标签: c# while-loop


【解决方案1】:

我觉得你很困惑。

...从用户接收单个字符的循环,打印 字符到控制台并一直这样做直到用户输入 'R'以外的字符

循环退出条件是任何不是'R' 的字符。换句话说,继续循环的唯一输入是'R'

无论用户输入什么,它只会循环一次结束然后退出。什么 我需要更改以继续循环吗?

这就是你的第一句话的意思。

我需要更改哪些内容才能继续循环?

更改循环退出条件。

【讨论】:

    【解决方案2】:

    while 循环中试试这个:

    cplayerSelection = Console.ReadKey().KeyChar
    

    这只有在你输入大写R时才有效

    如果你想允许三个字母,那么你可以试试:

    var letters = new[] {'R', 'P', 'S'};
    while (letters.Contains(cplayerSelection))
    {
        Console.WriteLine("Enter R, P, or S:");
        cplayerSelection = Console.ReadKey().KeyChar;
        Console.WriteLine(cplayerSelection);
    }
    

    如果您想不区分大小写检查,只需将这些字符的lower-case 版本添加到数组中。或者您可以使用它(@Habib 建议):

    while (letters.Any(r => r == char.ToUpper(cplayerSelection))) 
    

    【讨论】:

    • +1,您对ReadKey().KeyChar 的看法是正确的,否则循环将在第二次迭代中退出,
    • 为了不区分大小写,他还可以在测试期间使用 ToUpper。 while (letters.Contains(Char.ToUpper(cplayerSelection))
    • @tonyriddle 是的,但他/她应该首先将 char 转换为 string。然后使用 ToUpper 并再次转换 ToChar,因为它是一个字符数组。所以 ToUpper 看起来很简单,但很痛苦。添加数组中的三个额外字符要容易得多
    • 对于char不敏感比较,OP可以使用while (letters.Any(r=> r == char.ToUpper(cplayerSelection)))
    • @Selman22,有char.ToUpper和更安全的Char.ToUpperInvariant
    【解决方案3】:

    正如其他人所提到的,您需要注意区分大小写。您可以通过使用 char 的大写和小写检查输入来做到这一点。或者您可以将 char 转换为其大写/小写形式,然后仅与之比较。

    另外,对于像你这样总是至少执行一次的程序,使用 do while 更合适。例如:

    class Program
    {
        static void Main()
        {
            char input;
            do
            {
                input = char.ToUpperInvariant(Console.ReadKey().KeyChar);
            } while (input != 'R');
        }
    }
    

    【讨论】:

      【解决方案4】:

      Console.Read 只读取一个字符。下次进入循环时,它也会读取返回字符。根据您是否希望用户必须点击enter,您有几个选项。

      如果你想让他们按回车键:

      char cplayerSelection = 'R';
      
      while (cplayerSelection == 'R')
      {
          Console.WriteLine("Enter R, P, or S:");
          cplayerSelection = (Console.ReadLine())[0];
          Console.WriteLine(cplayerSelection);
      }
      

      如果你不想让他们按回车键:

      char cplayerSelection = 'R';
      
      while (cplayerSelection == 'R')
      {
          Console.WriteLine("Enter R, P, or S:");
          cplayerSelection = Console.ReadKey().KeyChar;
          Console.WriteLine(cplayerSelection);
      }
      

      【讨论】:

        【解决方案5】:

        我认为应该是的

        while(cplayerSelection != 'R' || cplayerSelection != 'r')
        

        您必须同时检查大写和小写字母,因为它们的值不同。

        编辑:还将 cplayerSelection 声明更改为其他字母,以便第一次实际执行循环。

        也替换这一行

        cplayerSelection = (char)Console.Read();
        

        cplayerSelection = Console.ReadKey().KeyChar;
        

        阅读 Habib 对此答案的评论以了解原因。

        【讨论】:

        • OP 也需要 Console.ReadKey().KeyChar, Selman22 是对的。但不幸的是他删除了答案。因为第一次迭代后它会收到回车字符并在第一次迭代后终止循环。
        【解决方案6】:

        根据http://social.msdn.microsoft.com/Forums/vstudio/en-US/5c5b43e2-4536-4411-a34f-290eb8525b4d/why-does-consolereadline-not-wait-for-user-input?forum=csharpgeneral,Console.Read() 将返回单个字符。第二次通过循环,它会拉出你的“返回”角色并退出你的循环。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-16
          • 2015-07-26
          • 2016-10-07
          • 2023-04-09
          • 1970-01-01
          • 2019-02-26
          相关资源
          最近更新 更多