2014-02-12 237 views
2

对于初学者的做法,我试图创建一个简单的循环,接受来自用户的单个字符,将该字符打印到控制台并保持这样做,直到用户输入'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

+3

!= not == –

+0

@SamLeach:不,他要==。你读过他的问题了吗?实际的文字?他在哪里描述他想要的? –

回答

4

我认为,它应该是

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

你必须检查大写和小写字母,因为它们没有相同的值。

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

而且替换此行

cplayerSelection = (char)Console.Read(); 

cplayerSelection = Console.ReadKey().KeyChar; 

阅读哈比卜的评论对这个答案,明白为什么。

+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); 
} 

如果要制作不区分大小写请检查简单地添加lower-case个版本,这些字符的array.Or的你可以使用这个(由@Habib建议):

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

+1,你对'ReadKey()。KeyChar'是正确的,因为否则循环将在第二次迭代中退出, – Habib

+0

为了不区分大小写,他也可以在测试期间使用ToUpper。 while(letters.Contains(Char.ToUpper(cplayerSelection)) – tonyriddle

+0

@tonyriddle是的,但他/她应该先将'char'转换为'string',然后使用ToUpper并再次转换ToChar,因为它是一个char数组。容易,但很痛苦。在字符串中加入三个额外的字符非常容易 –

2

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); 
} 
2

正如其他人所说,你需要警惕区分大小写。您可以通过使用char的大小写来检查输入。或者你可以将字符转换为大写/小写形式,只是比较。

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

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

我觉得你很困惑。

...循环,它从用户接受的单个字符,即 字符到控制台和不断这样做,直到用户输入比“R”以外的 字符打印。

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

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

这就是您的第一个声明的含义。

我需要改变以继续循环?

更改循环退出条件。