본문 바로가기

씨플플

[C++] std::cin.ignore(), std::cin.clear(), std::cin.fail() 함수

cin에서 입력을 받을 때 원하지 않는 값이 입력으로 들어올 때가 있다.

이유는 입력버퍼에 해당 값이 아직 남아있기 때문인데, 이때 위 함수들을 사용할 수 있다.


1. cin.ignore()

 

첫번째, cin.ignore 함수는 C언어의 fflush(stdin)과 같이 작동한다.

#include <iostream>
using namespace std;
int main()
{
	int a, b;

	cin >> a;
	cin.ignore(100, ',');
	cin >> b;

	cout << a + b;
}

 

위의 예제코드를 보면 a를 입력받을 때 9,7 이라는 형식으로 입력했다.

cin>>a가 실행되면서 a는 정수 9를 입력 받았고

그리고 cin.ignore(100, ',') 가 실행되면서 ',' 는 입력버퍼에서 지워지게 된 것이다.

따라서 아랫줄의 cin>>b는 따로 입력받지 않고 입력버퍼에서 7을 가져오게 된 것이다.

 

cin.ignore 함수의 원형은 istream& ignore (streamsize n = 1, int delim = EOF); 이다.

n의 수만큼의 문자를 읽어들인 후 버리게 되고

또는 delim에 해당하는 문자를 만나면 해당 문자까지를 읽어들인 후 버리게 된다.

(둘 중에 먼저 만족하는 조건을 따르게 된다.)


2. cin.fail(), cin.clear()

 

cin.fail() 함수와 cin.clear() 함수는 보통 함께 사용하는 경우가 많으니 동시에 설명한다.

 

1) cin.fail() 함수는 숫자형 변수에 문자를 넣으려는 코드와 같이 올바르지 않은 시도가 이루어 질 때 failbit를 설정하며 참(=1)을 반환하게 된다.

2) cin.clear() 함수는 내부상태플러그을 초기화 시켜 cin이 올바른 동작을 이어가게 한다.

#include <iostream>
using namespace std;
int main()
{
	int a;
	while (true)
	{
		cin >> a;
		if (cin.fail())
		{
			cout << "비정상" << endl;
			cin.clear();
			cin.ignore(5, '\n');
		}
	}
}

 

위 예제코드를 살펴보면 정수형 변수 a의 값으로 1과 2를 입력했을 땐 정상 실행된다.

하지만 abcde 를 입력했을 땐 (실제로는 변수 a의 값으로 'a'를 입력하려는 시도)

cin.fail()이 참값을 반환해서 아래 조건문이 실행된다.

"비정상"이라는 문장을 출력한 후, 내부상태플러그를 초기화 시키고, 입력버퍼에서 abcde를 지워준다.

 

이때 살펴볼 것은 cin.ignore(5, '\n'); 가 n의 값으로 5를 설정했기 때문에

'abcde'는 한번에 입력버퍼가 비워지며 조건문이 한번만 실행되지만

'abcdef'는 6번째 문자 'f'가 아직 입력버퍼에 남아있게 되어서 정수형 변수 a에 'f'가 입력되려는 잘못된 시도를 하게 되고 조건문이 한번 더 실행된다.

 

'씨플플' 카테고리의 다른 글

[C++] map, multimap container 정리  (0) 2020.03.29
[C++] pair 클래스에 대해서 (+ tuple)  (0) 2020.03.28
[C++] vector container 정리  (0) 2020.03.05
[C++] memset 함수 주의점에 대해서  (0) 2020.02.12