26.05.04
사용자 입력을 받을 때 단순히 cin >> 변수만 사용하면
잘못된 입력(문자, 소수, 혼합 입력 등)을 제대로 막지 못한다는 것을 배웠다.
이를 해결하기 위해 임시 변수(temp)와
입력 스트림 상태 처리(cin.fail, clear, ignore)를 활용했다.
예를 들어 아래와 같은 입력이 들어올 수 있다:
abc → 숫자가 아님5.5 → 소수5abc → 숫자 + 문자 혼합기존 방식:
cin >> choice;
👉 문제:
5abc → 5만 들어가고 abc는 남음5.5 → 5로 잘림abc → 입력 스트림이 망가짐if (cin.fail() || temp != (int)temp || temp < 1 || temp > 5)
{
cout << "잘못된 입력입니다. 다시 입력하세요: ";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
continue;
}
choice = (int)temp;
double temp;
cin >> temp;
👉 temp는 임시로 입력을 받는 변수
바로 int로 받으면:
5.5 → 5로 잘림 ❌5abc → 5만 들어감 ❌👉 그래서 더 넓은 타입인 double로 먼저 받고 검증한다.
temp != (int)temp
👉 의미:
👉 즉, 소수 입력을 걸러내는 조건
cin.fail()
👉 입력이 잘못되었을 때 true
예:
abc 입력 시 발생👉 입력 스트림이 망가진 상태를 의미
cin.clear();
👉 역할:
입력 스트림의 에러 상태를 초기화
비유:
고장난 입력 장치를 다시 정상 상태로 되돌리는 것
cin.ignore(numeric_limits<streamsize>::max(), '\n');
입력은 한 번에 이렇게 들어온다:
5abc\n
👉 cin >> temp는:
5만 가져감
👉 나머지:
abc\n (버퍼에 남아 있음)
👉 의미:
"최대한 많이 무시하겠다"
즉, 거의 무한대까지 버리겠다는 뜻
👉 의미:
"엔터(줄 끝)까지 버려라"
cin.ignore(numeric_limits<streamsize>::max(), '\n');
👉 "엔터가 나올 때까지 남은 입력을 전부 제거"
temp로 입력 받기
잘못된 입력인지 검사
cin.fail()temp != (int)temp< 1 || > 5잘못된 경우:
cin.clear() → 상태 복구cin.ignore() → 남은 입력 제거continue → 다시 입력정상일 경우:
choice = (int)temp;temp → 검사용 임시 변수cin.fail() → 입력 오류 감지cin.clear() → 오류 상태 초기화cin.ignore() → 남은 입력 제거temp != (int)temp → 소수 필터링입력 처리는 단순해 보이지만
실제로는 다양한 예외 상황을 고려해야 한다.
특히 C++에서는 입력 버퍼와 스트림 상태를 직접 관리해야 하므로
보다 명확한 검증 로직이 필요하다는 것을 알게 되었다.