2014-02-12 2 views
2

초보자를위한 연습에서는 사용자의 단일 문자를 허용하고 해당 문자를 콘솔에 인쇄 한 다음 사용자가 'R'을 입력 할 때까지 계속 수행하는 간단한 루프를 작성하려고합니다.while 루프를 반복하지 않는 while 루프

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

소문자는 같은 값을 가지지 않기 때문입니다.

편집 : 루프가 실제로 처음 실행될 수 있도록 cplayerSelection 선언을 다른 문자로 변경하십시오.

또한 이유를 이해하기 등이 답변에 하비브하여 주석을 읽기

cplayerSelection = Console.ReadKey().KeyChar; 

와 함께이 라인

cplayerSelection = (char)Console.Read(); 

를 교체합니다.

+1

OP는 ** Console.ReadKey(). KeyChar가 필요합니다.'Selman22'가 바로 그것입니다. 그러나 불행히도 그는 대답을 삭제했습니다. 첫 번째 반복 후에 캐리지 리턴을위한 문자를 받고 첫 번째 반복 후에 루프를 종료하기 때문입니다. – Habib

4

하면 while 루프의 내부에,이 일을 시도해보십시오 대문자 R

를 입력하면 당신은 당신이 시도 할 수 있습니다 세 글자를 허용하려면

cplayerSelection = Console.ReadKey().KeyChar 

그에만 작동합니다 :

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에 의해 제안) 사용할 수있는 array.Or에 이러한 문자개 버전 : 나는

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

하는 당신은 대문자와 모두 확인해야해야한다고 생각

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

+1, 당신은'ReadKey(). KeyChar'에 대해 옳았습니다. 그렇지 않으면 루프가 2 번째 반복에서 끝날 것이기 때문입니다. – Habib

+0

대소 문자를 구분하지 않으면 테스트 중에 ToUpper를 사용할 수도 있습니다. while (char.ToUpper (cplayerSelection)) – tonyriddle

+0

@tonyriddle 네,하지만 그/그녀는'char'을'string' first로 변환해야합니다. ToUpper를 사용하고 char 배열이므로 ToChar를 다시 변환하십시오. 쉽지 만 그것은 고통 스럽네요. 배열에 3 개의 여분의 문자를 추가하는 것이 훨씬 쉽습니다. 문자가 구분되지 않는 비교를 위해 –

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'입니다.

사용자가 입력 한 내용과 관계없이 한 번 종료 후 종료됩니다. 어떤 루프를 계속하려면 을 변경해야합니까?

첫 문장의 의미입니다.

루프를 계속하려면 무엇을 변경해야합니까?

루프 종료 조건을 변경하십시오.