2011-11-04 5 views
0

이전에 저는 C 프로그래머입니다. (시스템 프로그래밍에 대해 더 알고 싶지만 어셈블리를 선택하지 않으려 고 C를 선택합니다.)하지만 나중에 내 대학에서 C++을 가져야 만합니다. cincout 개체를 사용하는 데 어려움을 겪고 있습니다. 신뢰할 수있는 printf(), scanf(), getchar() 매크로와 비교하면 약간의 변경이 있습니다. 여기에 코드가 있습니다.cin 객체를 사용하여 입력 유효성 검사 및 버퍼 지우기 (C++)

강령

int main(void) 
{ 
    using namespace std; 

    cout << "What is the number?\n\n"; 
    cout << "#Number :"; 
    cin >> num; 

    while(cin.fail()) 
    { 
     cin.clear(); 
     cin.ignore(1000 , '\n'); 
     cout << "Please enter a number\n\n"; 
     cout << "#Number :"; 
     cin >> num; 
    } 

    return 0; 
} 



[질문

1) 나는 미만의 사용자 (에서 번호를 요청하기 위해이 코드를 원하는 것보다 더 많거나 0과 같음), 사용자가 문자 또는 문자열을 입력 할 때 사용자에게 경고를 보내고 입력 버퍼를 지우고 사용자에게 새 값을 다시 묻기를 원합니다. 숫자가 될 때까지 e.

2.) 그래서 그냥 주위를 검색하고 페이지 설교 방법을 찾으십시오. 그래서 나는 단지 길을 따라 갔지만 실패했습니다. 왜 내가이 코드를 실행하면, 출력이 무한 루프가되는 문자를 입력해야하는지 모르겠다. Please enter a number.이 코드에서 실수를 범한 것은 무엇입니까 ?? 내 문제

P를 읽는 시간을 보내는에 대한

감사/S : 저는는 MinGW 컴파일러와 CodeBlocks를 사용하고 있습니다.

답변

2

어떻게 실패했는지 말하지 않으므로 의 문제를 말하기는 어렵습니다. num을 결코 선언하지 않는다는 사실은 명백한 하나의 문제입니다. 1000 자보다 긴 행을 입력해도 오류가 발생합니다.

C++에서 더욱 관용적 인 해결 방법은 입력 행을 std::getline으로 입력 한 다음 std::istringstream을 사용하여 행을 숫자로 변환하는 것입니다.

+0

어쨌든 원래 소스 코드에 선언 해 주셔서 감사합니다 :) 단지 여기에 줄을 추가하는 것을 잊어 버렸습니다. – caramel1995

0

형식 지정 입력을 사용하는 표준 방법은 작업 자체에 대한 조건부 검사입니다. 또한 전체 행을 읽고 토큰으로 토큰을 추출하는 대신 구문 분석을 시도 할 수 있습니다. 예 : 이렇게 :

int num; 

for (bool success = false; !success;) 
{ 
    std::cout << "Please enter a number: "; 

    std::string line; 
    if (std::cin >> line) 
    { 
    std::istringstream iss(line); 
    if (iss >> num) success = true; 
    } 

    if (!success) { std::cout << "Error!\n"; } 
} 

std::cout << "Thank you. You said: " << num << std::endl; 

오류 분기에 진단 출력을 추가 할 수 있습니다.