입력 과정에서 버퍼 처리에 관한 실수

C++의 입력을 담당하는 라이브러리 함수 중에서 cin과 getline이 있다.
cin과 getline의 차이를 앎에도 불구하고, 실수를 할 때가 있다.
바로 섞어서 사용할 때다.

cin은 띄어쓰기(스페이스 : ' ')와 줄바꿈(엔터 : '\n')를 기준으로 잘라서 입력을 받는다.
다시 말해서, 저 두 문자를 만나면 데이터 하나에 대한 입력이 끝나는 것이다.
여기서 눈에 보이지는 않지만, 버퍼에 문자가 남게 된다.
우리가 입력을 받을 때, cin만 쓴다면 버퍼에 남아있어도 자동으로 무시하기 때문에
어떠한 문제가 발생하지 않는다.

getline은 함수의 특성상 버퍼에 문자를 남기지 않는다.
또한, 구분자가 없이 모든 입력을 그대로 받기 때문에 문자열을 받을 때 사용하곤 한다.
getline도 그 자체만으로는 어떠한 문제를 발생시키지 않는다.

그러나 cin -> getline을 하는 경우에는 문제가 발생할 수 있다.
cin을 사용하면 버퍼에 띄어쓰기나 줄바꿈 문자가 남아있게 되고,
여기서 getline을 사용하면 버퍼에 남아있는 문자를 그대로 받게 된다.
따라서, 같이 사용하는 경우에는 버퍼 처리를 꼭 해주어야 한다.

버퍼에 남아있는 문자가 의미없는 경우 cin.ignore();를 통해서 버퍼를 비우면 된다.
cin -> cin.ignore -> getline 순서가 되는 것이다.
* C의 scanf와, Java의 new Scanner(System.in).next도 마찬가지로 버퍼에 남긴다.

사용하는 언어가 달라도 입력 라이브러리 함수에 대해서는 사용 목적에 따라
꼭 버퍼 처리를 확인하고 처리하는 습관을 갖자.

댓글

이 블로그의 인기 게시물

[PS] BOJ 20543번 폭탄 던지는 태영이

프로그래밍에서 실수형의 부정확성

프로그래머스 2019 윈터코딩 온라인 테스트를 보았다. (풀이)