2014-01-16 3 views
0

사용자가 char을 입력하길 원합니다. 나는 그들이 입력하는 것을 걸러 내고 그들이 입력하는 첫 번째 문자 만 가져 가고 싶습니다.cin.get() 너무 많이 받기

int main(){ 
    while (true){ 
     char n = readOption(); 
     cout << n << std::endl; 
    } 
    return 0; 
} 


char readOption() { 
    char input = '\0'; 
    while (input != '\n') { 
     input = cin.get(); 
     if (isalpha(input)) { 
      break; 
     } 
    } 
    return toupper(input); 
} 

[email protected] jkjoi을 입력하면 콘솔이 인쇄됩니다.

J 
K 
J 
O 
I 

나는 단지 J 만 인쇄하고 싶습니다. 다른 글자를 인쇄하는 이유는 무엇입니까?

while (true) 
{ 
    char n = readOption(); 
    cout << n << std::endl; 
} 

이 이상 영원히 이상 당신의 읽기 함수를 호출한다 : 영원히 (당신이 당신의 세미콜론 오류를 수정 후)를 루프 때문에

+0

코미디 코드가 맞습니까? C++에서 세미콜론으로 문장을 종료해야한다는 것을 알고 있습니까? –

답변

2

그것은 모든 문자를 인쇄! 읽기 기능은 알파 문자를 얻을 때까지 반복되므로 "[email protected] "을 무시한 다음 while (true) 루프의 각 반복마다 1 문자를 가져옵니다. 당신이 첫 번째 알파 문자를 읽은 후 중지하려면,하지 루프 수행

char n = readOption(); 
cout << n << std::endl; 

가 당신의 의견을 함께

업데이트를 실제로 완전히 코드를 다시 작성할 수 있습니다

std::locale loc; 
char c = '\0'; 
do 
{ 
    // get a character with error checking 
    while (!(std::cin >> c)) 
    { 
     std::cin.clear(); 
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    } 
} while (!std::isalpha(c, loc)); 
// ignore the rest of the input 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
+0

새로운 사용자 입력을 허용하려면 어떻게 코드를 작성해야합니까? 루프를 없애고 새로운 n = readOption()을 추가하면됩니다. 새 사용자를 입력하라는 메시지를 표시하지 않고 대신 현재와 똑같이 작동합니다. – Chronicle

+2

@ 크로니클 당신이하려는 일을 이해하고 있는지 모르겠지만 나머지 줄을 버리고 사용자에게 새로운 입력을 요구하려면'std :: cin.ignore (std :: numeric_limits :: max(), '\ n');'while 루프에서. – Praetorian

+0

@ 크로니클 사용자가 단일 영문자를 입력하고 싶습니까? 해당 문자 다음에 나머지 입력을 유지하거나 삭제 하시겠습니까? –

2

질문을 받았기 때문에.

루프에서이 작업을 수행하십시오.

한 번만 수행하려면 한 번만 수행하십시오. 루프를 제거하십시오.

관련 문제