[TIL] C++ 입력 검증 (cin.fail, temp, ignore)

최석훈·2026년 5월 4일

26.05.04

📌 TIL - C++ 입력 검증 (cin.fail, temp, ignore)

🔍 오늘 배운 핵심

사용자 입력을 받을 때 단순히 cin >> 변수만 사용하면
잘못된 입력(문자, 소수, 혼합 입력 등)을 제대로 막지 못한다는 것을 배웠다.

이를 해결하기 위해 임시 변수(temp)
입력 스트림 상태 처리(cin.fail, clear, ignore)를 활용했다.


💡 문제 상황

예를 들어 아래와 같은 입력이 들어올 수 있다:

  • abc → 숫자가 아님
  • 5.5 → 소수
  • 5abc → 숫자 + 문자 혼합

기존 방식:

cin >> choice;

👉 문제:

  • 5abc5만 들어가고 abc는 남음
  • 5.55로 잘림
  • 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;

🔍 temp의 역할

double temp;
cin >> temp;

👉 temp임시로 입력을 받는 변수

💡 왜 필요한가?

바로 int로 받으면:

  • 5.5 → 5로 잘림 ❌
  • 5abc → 5만 들어감 ❌

👉 그래서 더 넓은 타입인 double로 먼저 받고 검증한다.


✔️ 소수 판별

temp != (int)temp

👉 의미:

  • 정수면 같음 (예: 5.0 == 5)
  • 소수면 다름 (예: 5.5 != 5)

👉 즉, 소수 입력을 걸러내는 조건


🔍 cin.fail()

cin.fail()

👉 입력이 잘못되었을 때 true

예:

  • abc 입력 시 발생

👉 입력 스트림이 망가진 상태를 의미


🔍 cin.clear()

cin.clear();

👉 역할:

입력 스트림의 에러 상태를 초기화

비유:

고장난 입력 장치를 다시 정상 상태로 되돌리는 것


🔍 cin.ignore()

cin.ignore(numeric_limits<streamsize>::max(), '\n');

💡 입력 버퍼란?

입력은 한 번에 이렇게 들어온다:

5abc\n

👉 cin >> temp는:

5만 가져감

👉 나머지:

abc\n (버퍼에 남아 있음)

🔍 numeric_limits::max()

👉 의미:

"최대한 많이 무시하겠다"

즉, 거의 무한대까지 버리겠다는 뜻


🔍 '\n'

👉 의미:

"엔터(줄 끝)까지 버려라"


✅ 최종 의미

cin.ignore(numeric_limits<streamsize>::max(), '\n');

👉 "엔터가 나올 때까지 남은 입력을 전부 제거"


🎯 전체 흐름 정리

  1. temp로 입력 받기

  2. 잘못된 입력인지 검사

    • 문자 → cin.fail()
    • 소수 → temp != (int)temp
    • 범위 → < 1 || > 5
  3. 잘못된 경우:

    • cin.clear() → 상태 복구
    • cin.ignore() → 남은 입력 제거
    • continue → 다시 입력
  4. 정상일 경우:

    • choice = (int)temp;

🔥 핵심 정리

  • temp → 검사용 임시 변수
  • cin.fail() → 입력 오류 감지
  • cin.clear() → 오류 상태 초기화
  • cin.ignore() → 남은 입력 제거
  • temp != (int)temp → 소수 필터링

🧠 느낀 점

입력 처리는 단순해 보이지만
실제로는 다양한 예외 상황을 고려해야 한다.

특히 C++에서는 입력 버퍼와 스트림 상태를 직접 관리해야 하므로
보다 명확한 검증 로직이 필요하다는 것을 알게 되었다.

profile
반갑습니다.

0개의 댓글