2010-02-28 7 views
1

내가 다음 코드 조각이있어 :C++ - 올바른 입력 유형을 확인

... 
int x = 0; 
int y = 0; 
cin >> x >> y; 
if (x == -1 && y == -1) { 
    cout << "exit!"; 
} 
else { 
    doSomething(); 
} 
... 

를 그리고 그것이 내가이 개 번호를 입력하는 경우에만 있지만, 작동합니다. 'n'과 같은 편지를 입력하면 프로그램이 무한 루프에 빠지게됩니다. 사용자가 숫자를 입력했는지 확인하고 무한 루프를 피하려면 어떻게해야합니까?

+1

귀하의 문제를 이해하지 못합니다. 'n'을 입력하면 작동하지 않습니까? 마지막에는 'n'도 숫자이므로 이상합니다. 2sd 코드에 루프가 없으면 어떻게하면 무한 루프가 발생할 수 있다고 생각합니까? –

+0

프로그램을 실행할 때 두 개의 숫자를 공백으로 구분하여 입력해야합니다 (x 및 y). 그러나 편지와 같은 다른 내용을 입력하면 프로그램이 무한 루프가됩니다. 그래서 사용자가 두 개의 숫자 만 입력했는지 확인하기 위해 입력을 확인하려고합니다. – cornjuliox

답변

4

cin이 입력 데이터와 읽으려는 변수 사이에 유형 불일치가 있으면 "실패"상태가됩니다. 충돌하는 변수는 업데이트되지 않습니다. 관찰 :

2010-02-27 22:54:27 ~/tmp/ $ cat ju3.cpp 
#include <iostream> 
using namespace std; 
int main() { 
    int    x = 0; 
    int    y = 12345; 
    string   s, a; 

    printf("cin good? %d, reading...\n", cin.good()); 
    cin >> a >> x >> y >> s; 
    printf("a=%s, x=%d, y=%d, s=%s\n", a.c_str(), x, y, s.c_str()); 
    printf("... read, cin good? %d\n", cin.good()); 
    return 0; 
} 
2010-02-27 22:54:36 ~/tmp/ $ g++ ju3.cpp -o ju3 
2010-02-27 22:54:56 ~/tmp/ $ echo 1 2 3 4 | ./ju3 
cin good? 1, reading... 
a=1, x=2, y=3, s=4 
... read, cin good? 1 
2010-02-27 22:55:05 ~/tmp/ $ echo a x y z | ./ju3 
cin good? 1, reading... 
a=a, x=0, y=12345, s= 
... read, cin good? 0 

표시되는 문제를 피하는 데는 두 가지 방법이 있습니다.

  • 더러운 빠른 앤 솔루션은 대신 -1에 숫자를 비교하는 cin.good()를 확인하는 것입니다.
  • cin이 더 안정적으로 작동하게하려면 int 대신 string s를 읽고 숫자 문자 만 포함하는지 수동으로 확인하십시오. 그런 다음 stringstream을 사용하여 문자열을 쉽게 숫자로 변환 할 수 있습니다.
+0

좋아요, 그래서 지금은 int 대신 문자열을 읽으려면 cin >> x >> y를 사용하고 있습니다 만, 문자열에 숫자 만 들어 있는지 어떻게 확인합니까? 문자열 클래스에는 isdigit() 함수가 없으며 문자열의 각 문자를 반복하고 isdigit()를 호출하려고해도이 함수는 작동하지 않습니다. – cornjuliox

+0

Yin Zhu가 말했듯이 ctype.h 헤더 (또는 C++과 동등한 cctype)를 살펴보십시오. 각 편지를 개별적으로 확인해야합니다. 코드가 예상대로 작동하지 않으면 printf를 사용하여 이유를 찾으십시오! –

0

두 개의 문자열을 입력하고 ctype.h의 함수를 사용하여 입력의 유효성을 검사하십시오.