int GetValidInteger()
{
int Value;
while (1)
{
cin >> Value;
if (cin.fail())
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
else break;
}
return Value;
}
사용자 입력 값이 유효한지 검증해서 값을 사용하기 위해 함수를 만들었다.
이 과정에서 cin::fail, cin::clear, cin::ignor 는 C++에서 표준 입력 스트립 std::cin과 관련된 입력 처리 및 오류 제어를 다룰 때, 자주 사용되는 함수라는 것을 알게 되었다.
std::cin::fail
- 입력 도중 예기치 않은 데이터 유형을 입력하거나 입력 스트림에 오류가 발생하면 스트림은 "실패 상태"가 된다.
- 입력 스트림 std::cin 이 "실패 상태"인지를 확인하고 맞다면 true를, 정상 상태라면 false를 반환한다.
- "실패 상태"라면 추가 입력이 더 이상 처리되지 않는다.
std::cin::clear
- 입력 스트림의 "실패 상태"를 초기화해, 스트림을 다시 "정상 상태"로 만들어 재사용 가능하게 만든다.
- cin::fail 상태를 복구할 때 사용함으로 주로 같이 사용된다.
std::cin::ignore
std::cin.ignore(count, delimiter);
cin.ignore(numeric_limits<streamsize>::max(), '\n');
- 잘못된 입력이 입력 스트림에 남아 있는 경우, 이를 무시해서 프로그램이 정상적으로 작동하도록 한다.
- 스트림 버퍼에 남아있는 불필요한 데이터를 count개 만큼 제거하거나 특정 문자가 나올 때 까지 제거한다.
- count: 무시할 최대 문자 수를 의미한다.(기본 값: 1)
- delimiter: 멈출 지점이 될 문자를 의미한다.
- 아래 코드와 같이 사용한다면, 개행문자가 나올 때 까지 입력 스트림에서 최대 크기의 데이터를 제거한다는 의미이다.
std::numeric_limits<T>
- C++ 표준 라이브러리 템플릿 클래스이다.
- 데이터 타입별로 숫자와 관련된 속성을 정의하고, 타입의 한계를 제공하기 위해 설계되었다.
- max()는 타입의 최대값, min()은 타입의 최소값을 의미하고 이 밖에도 많은 정적 멤버 함수들이 있다.
- 위 코드에서 사용되었던 streamsize는 스트림의 문자 개수 혹은 데이터 크기를 표현하는 타입이다.
'내배캠 > C++' 카테고리의 다른 글
std::rand / std::srand / std::time (0) | 2024.12.26 |
---|---|
std::fixed / std::setprecision (0) | 2024.12.26 |
std::transform (1) | 2024.12.26 |
템플릿 함수 (0) | 2024.12.24 |
스마트 포인터 (0) | 2024.12.24 |