2014-11-28 2 views
4

저는 뱅킹 시스템 프로젝트를 진행하고 있으며 모든 입력이 유효한지 확인해야합니다 (프로그램은 견고해야합니다). 유효하지 않은 입력이 주어지면 사용자는 다시 입력해야합니다.
하지만 변수가 int이고 사용자가 char 유형을 입력하면 무한 루프가 시작됩니다. 예
:int 대신 char을 입력하면 무한 루프를 회피합니다.

int i; 
cin>>i; 

사용자가 char 무한 루프 시작 들어가면. 그것을 피하고 사용자에게 입력을 다시 요청할 수 있습니까?
덕분에 무한 루프

+2

테스트 판독 후'cin' 상태. 아마도 간단한 'if (cin) ...'가 작동 할 수 있습니다. – Niall

+1

모든 입력은 은행 시스템에 유효합니까? 당신이 처음 알게 될 것입니다. – Bathsheba

+2

누군가가 잘못된 입력 문자를 입력하면 [내 프로그램이 무한 루프로 바뀌는 이유는 무엇입니까?] (http://www.parashift.com/c++-faq/stream-input-failure.html)를 참조하십시오. –

답변

2

다음은 도움이 될 수있는 또 다른 방법입니다. 먼저 std::string에 글을 쓴 다음 숫자가 맞는지 문자열 검사의 모든 요소를 ​​검토합니다. <cctype> for isdigit()<cstdlib> for std::atoi 헤더를 사용하면 컴파일러에서 지원하는 경우 std::stoi을 사용할 수 있지만 C++ 11에서는 사용할 수 있습니다.

당신이 작성하는 경우 : 141.4123이 결과는 변환 한 후이 될 것입니다 당신이 int로 변환하기 때문에, 결과는 잘린 될 것이다 (당신이 사용자 유형을 할 경우 '.').

동작 예 :

int str_check(string& holder, int& x) 
{ 
    bool all_digits = true; // we expect that all be digits. 

    if (cin >> holder) { 
    for(const auto& i : holder) { 
     if (!isdigit(i) && i != '.') { // '.' will also pass the test. 
     all_digits = false; 
     break; 
     } 
    } 
    if (all_digits) { 
     x = atoi(holder.c_str()); // convert str to int using std::atoi 
     return 1; 
    } 
    else 
     return 0; 
    } 
} 

int main() 
{ 
    int x{}; 
    string holder{}; 
    while (1) 
    { 
    if (str_check(holder, x)) 
     cout << x << '\n'; 
    } 

    return 0; 
} 
3

이유 :

CIN 실패한 상태로 전환하고 재설정하는 에러 플래그 및 버퍼까지, 그것으로 더 호출을 무시합니다. 입력이 숫자 인 경우

cin.clear(); 
cin.ignore(100, '\n'); //100 --> asks cin to discard 100 characters from the input stream. 

확인 : 코드에서

은, 심지어 비 INT 타입 어쨌든 int로 캐스팅됩니다. 입력이 문자 배열에 입력하지 않고 각 숫자에 isdigit() 함수를 호출하지 않고도 입력이 숫자인지 확인할 방법이 없습니다.

함수 isdigit()를 사용하여 숫자와 영문자를 구분할 수 있습니다. 이 기능은 헤더에 있습니다.

is_int() 함수는 다음과 같습니다.

for(int i=0; char[i]!='\0';i++){ 
    if(!isdigit(str[i])) 
     return false; 
} 
return true; 
관련 문제