不会一直循环的 While 循环

3

为了初学者练习,我正在尝试创建一个简单的循环,接受用户输入的单个字符,并将该字符打印到控制台,直到用户输入“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);
            }
        }

    }
}

无论用户输入什么,循环只会执行一次就退出。我需要做出哪些更改才能继续进行循环?

1
你可以尝试使用 Console.ReadKey()。 - Tomtom
@SamLeach:不,他想要的是==。你读了他的问题吗?实际的文本在哪里?他描述了他想要什么? - Colin DeClue
@ColinDeClue,是的。也许你应该重新阅读一下?循环退出条件是“不是'R'字符”。它不会循环,因为除了'R'之外的任何字符都会退出循环。 - Sam Leach
@SamLeach 这正是他想要的,然而上面的代码在输入'R'时也会退出。 - tonyriddle
6个回答

5

我认为应该是这样的

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

由于大小写字母的值不同,您需要检查大写字母和小写字母。

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

同时替换此行

cplayerSelection = (char)Console.Read();

使用

cplayerSelection = Console.ReadKey().KeyChar;

请阅读Habib在此答案下的评论以了解原因。


1
OP还需要Console.ReadKey().KeyChar,Selman22说得对。但不幸的是他删掉了答案。因为在第一次迭代之后,它将接收到回车符并在第一次迭代后终止循环。 - Habib

4

在你的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);
}

如果您想进行不区分大小写的检查,只需将这些字符的 小写 版本添加到数组中。或者您可以使用以下方法(由@Habib建议):
while (letters.Any(r => r == char.ToUpper(cplayerSelection))) 

1
+1,你说的 ReadKey().KeyChar 是正确的,否则循环会在第二次迭代时退出。 - Habib
对于不区分大小写,他在测试期间也可以使用 ToUpper。while (letters.Contains(Char.ToUpper(cplayerSelection))) - tonyriddle
@tonyriddle 是的,但他/她应该先将那个char转换为string。然后使用ToUpper并再次转换为Char,因为它是一个字符数组。所以ToUpper看起来很容易,但实际上很痛苦。在数组中添加三个额外的字符要容易得多。 - Selman Genç
对于字符不区分大小写的比较,程序员可以使用 while (letters.Any(r=> r == char.ToUpper(cplayerSelection))) - Habib
@Selman22,有char.ToUpper和更安全的Char.ToUpperInvariant - Habib

2

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

如果您想让他们按下 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);
}

2

正如其他人所提到的,您需要注意大小写敏感性。您可以通过检查输入的字符的大写和小写来实现。或者您可以将字符转换为其大写/小写形式,仅与其进行比较。

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

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

2
我认为你可能有些困惑。
循环接受用户的单个字符输入,将该字符打印到控制台并一直重复此操作,直到用户输入一个与'R'不同的字符。换句话说,唯一能继续循环的输入是'R'。
无论用户输入什么,它只会循环一次然后退出。你需要改变什么来继续循环?
这就是你第一条语句的意思。
我需要改变循环退出条件。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接