2016-10-12 4 views
0

나는 StackOverflow에 대한 많은 기존 답변을 거쳤지만 아직도 붙어 있습니다.C++에서 cin 버퍼를 지우는 방법

코드 : I 입력 예컨대 s 대신 정수를 짜서 입력하면

int c; 
cin >> c; 

if(cin.fail()) { 
    cout << "Wrong Input"; 
    cin.clear(); 
    cin.ignore(INT_MAX, '\n'); 
} 
else 
{ 
    cout << c*2; 
} 

, 그것은 Wrong Input 출력한다. 그러나 정수를 입력 한 다음 문자열을 입력하면 문자열을 무시하고 이전 정수 결과를 계속 출력하므로 cin 버퍼를 지우지 않고 이전 값인 c이 계속 실행됩니다. 아무도 작동하지 않는 것처럼 cin.ignore() 이외의 가장 좋은 방법을 제안 할 수 있습니까? 그리고 나를 위해, cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');의 max() 오류가 발생합니다. 그래서 이것은 작동하지 않습니다.

+1

왜이 작업을 할 수있는 올바른 방법을 얻을 수있는 질문을하지? [이] (http://stackoverflow.com/questions/21567291/why-does-stdgetline-skip-input-after-a-formatted-extraction) 상황을 처리하는 올바른 방법입니다. – NathanOliver

+0

질문을 명확하게 할 수 있습니까 (예 : [MCVE] 제공). 나는 당신의 코드에서 작동해서는 안되는 것을 발견 할 수 없다. 나는 그것을 컴파일 할 수 없다. (http://ideone.com/Syb32Q) –

+0

@ NathanOliver 이렇게하면 'numeric_limits :: max()'에러가 발생한다. max() 함수는'#define max (a, b)) (((a)> (b)))? (a) : (b)) '파일에이 문장을 정의하더라도. @ πάνταῥεῖ 나는 비디오를 업로드하려고 노력한다. 나는 그것이 더 명백 할 것이라고 생각한다. – Nix

답변

0

max() 함수는 파일의 시작 부분에 정의해야합니다. cin.ignore() 버퍼를 지우려면 아주 잘 작동하지만 숫자 제한 함수 max()가 필요합니다. 내 경우에는 오류가 발생했습니다.

솔루션 :

#ifdef max 
#define max 
#endif 

상단에이 줄을 추가하고, 같은 잘 작동합니다 다음과 같은 기능.

int id; 
bool b; 
do { 
    cout << "Enter id: "; 
    cin >> id; 
    b = cin.fail(); 
    cin.clear(); 
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
} while (b == true); 

P.S : 감사 @Nathan는

관련 문제