#include <iostream>
using namespace std;
int main(){
int num;
cout << "Enter an integer: ";
cin >> num;
if(cin.fail()){ //입력 실패 여부
cout << "Invalid input! Please enter an integer." << endl;
cin.clear(); //실패 상태 플래그 초기화
cin.ignore(numeric_limits<streamsize>::max(), '/n'); //남은 입력 버퍼 제거
}
else{
cout << "You entered: " << num << endl;
}
return 0;
}
📌 입력 버퍼
1. 사용자의 입력 > 입력 버퍼에 저장
2. 프로그램에서 데이터 요청 시 입력 버퍼에 있는 "숫자 데이터"만 읽어옴(나머지는 버퍼에 남음)
3. 버퍼에 있는 데이터가 전부 소비되지 않는다면(ex 숫자만 읽어가고 남은 문자) 계속해서 버퍼에 존재
4. 입력 실패 상태가 되고 계속해서 오류 발생시킴
📌 입력 버퍼 관리 방법
1. cin.ignore(n, delim)
입력 버퍼에 남아 있는 데이터 무시
cin.ignore(100, '\n'); // 최대 100글자 또는 줄바꿈까지 무시
2. cin.clear()
입력 스트림의 실패 상태 초기화(잘못된 입력 발생 후 재입력을 위해 필요)
3. getline(cin, line)
한 줄 전체를 입력받아 버퍼에 남은 데이터 방지
❓ numeric_limits<streamsize>::max()
streamsize타입이 표현할 수 있는 최대 크기
실질적으로 "가능한 한 많은 문자를 무시하라"는 의미
numeric_limits : 템플릿 클래스로 특정 데이터 타입의 속성 제공(어떤 타입의 최솟값, 최댓값, 정밀도, 부호 여부 등을 확인 가능)
streamsize : C++에서 스트림(std::cin, std::cout 등) 작업 시 사용되는 정수 타입
max() : numeric_limits 클래스의 정적 멤버 함수로 해당 타입에서 가질 수 있는최댓값을 반환
'C++' 카테고리의 다른 글
정적 바인딩 vs 동적 바인딩 (0) | 2025.02.09 |
---|---|
자료형의 오버플로우 (0) | 2025.02.09 |
Vector (0) | 2025.02.09 |
반복문 (0) | 2025.02.09 |
복사 vs 참조 (0) | 2025.02.09 |