2013-02-23 1 views
1

기본적으로 숫자를 입력으로 예상합니다. 이제 else else if loop가 잘 작동한다는 것을 알았으니 크기는 무시해도됩니다. 그러나 그 숫자가 조금 더 까다 롭다는 것을 증명한다면 테스트를 해보십시오. 난 그냥 다시 함수를 호출하고 사용자가 뭔가 영숫자 또는 일반 단어로 입력하면 다시 시작 싶어요. 또는 엔터를 누릅니다. 숫자가 아닌 것. 나는 int numTemp에 입력했기 때문에 cin을 시도했으나 무한 루프가 발생하여 수많은 시간이 "what is the bitrate"에 불과합니다. 누구든지 내가 뭘 잘못하고 있는지 알아? 첫 번째 if 문 안에 cin.clear()cin.ignore(100, "\n")을 넣으려고했으나 아무 소용이 없었습니다. 미리 감사드립니다.조건을 검사 할 때 무한 루프가 발생했습니다. C++! cin

bool iTunes::setBitRate() 
{ 
cout << "What is the bitrate? "; 
int numTemp; 
cin >> numTemp; 
if (!cin) 
{ 
    cout << "WRONG" << endl; 
    setBitRate(); 
} 
else if(numTemp < MIN_BITRATE || numTemp > MAX_BITRATE) 
{ 
    cout << "Bit Rate out of range" << endl; 
    setBitRate(); 
} 
else 
{ 
    bitRate = numTemp; 
} 
} 
+3

, 나는 값에 읽을 루핑 원합니다. –

+0

입력에서 비 숫자를 제거하려면'cin.clear()'와'cin.ignore'가 필요합니다. 그렇지 않으면 똑같은 이유로 연속 입력이 모두 실패합니다. –

답변

-1

난 당신이 문자열을 좋아하지 않는 경우에 당신은 단지 대신 INT의 사용자로부터 문자열을 읽고, 다음을 확인하고 새로운 입력하라는 메시지를 표시 할 수

bool iTunes::setBitRate() 
{ 
    cout << "What is the bitrate? "; 
    int numTemp = 0; 
    cin >> numTemp; 
    if (!numTemp) 
    { 
    cout << "WRONG" << endl; 
    setBitRate(); 
    } 
    else if(numTemp < MIN_BITRATE || numTemp > MAX_BITRATE) 
    { 
    cout << "Bit Rate out of range" << endl; 
    setBitRate(); 
    } 
    else 
    { 
    bitRate = numTemp; 
    } 
} 
+0

오류 케이스에서 초기화되지 않을 수도있는 numTemp 값을 테스트 할 때이 정의되지 않은 동작을 호출합니다 생각합니다. –

+0

확인해 주셔서 감사합니다. – Riskhan

+0

이유를 설명해주십시오. – Riskhan

0

이 의지 할 수 생각 (예 : 숫자로 변환되지 않으면 strtol으로 확인할 수 있습니다). 당신이 입력이 숫자 또는 문자 여부를 확인하려면

0

, 당신은 isdigit을 사용할 수 있지만, 당신은 당신이 atoiint로 변환 할 수있는 자리가있을 때 그것을 char 다음을 통과해야합니다.

0

cin >> numTemp 인해 비 수치 입력 오류를 일으키는 문자 실패 입력 스트림으로부터 제거 NOT이다. 따라서 다음 번에 스트림 추출 연산자가 호출되면 마지막으로 입력 한 것과 동일한 숫자가 아닌 입력이 표시됩니다. 이것을 피하려면 기존 입력을 건너 뛸 필요가 있습니다. 이 일을

한 가지 방법으로 정수로 변환하기 전에 텍스트의 전체 라인을 읽을 getline()을 사용하는 것입니다.

#include <cstdlib> 

bool getint(istream& in, int & out) { 
    string line; 
    getline(in, line); 
    char* endptr; 
    out = strtol(line.c_str(), &endptr, 10); 
    return endptr!=line.c_str(); 
} 

bool iTunes::setBitRate() 
{ 
    cout << "What is the bitrate? "; 
    int numTemp; 
    if (!getint(cin, numTemp) && cin) 
    { 
     cout << "WRONG" << endl; 
     setBitRate(); 
    } 
    else if(numTemp < MIN_BITRATE || numTemp > MAX_BITRATE) 
    { 
     cout << "Bit Rate out of range" << endl; 
     setBitRate(); 
    } 
    else 
    { 
     bitRate = numTemp; 
    } 
} 

참고 : :이 folllowing 코드는이 보여 당신은 각 일부 오류가 발생하지 않았는지 확인 읽은 후 CIN의 상태를 확인해야합니다. 재귀 호출이이 작업을 수행하는 것이 좋습니다 경우는 의심의 IMHO

관련 문제