코드를 짜면서 입력을 받을때가 많습니다. 그럴때마다 우리는 cin으로 입력을 받아옵니다.
하지만 cin은 공백이 있으면 입력이 끝나기 떄문에 문자열을 입력받을때 공백이 있으면 받아오기 힘듭니다.
그럴때 쓰는 함수가 바로 getline() 함수입니다. getline함수는 공백까지 문자열로 받아오는 역활을 합니다.
콘솔에서 cin, cin.getline() 으로 입력을 받을경우 바로 변수에 저장되지않고 입력 버퍼에 저장되었다가.
입력 버퍼에 저장된 값을 변수로 저장을 하며 입력 버퍼에 있는 문자들은 사라지는 것입니다.
버퍼 란?
장치와 장치 간의 데이터 전송을 할 때 완충작용을 하기 위한 임시 데이터 저장 공간.
여기서 문제가 있는데 입력 버퍼에 입력받은 값을 저장하고 그 값을 변수에 저장하면서 입력 버퍼에 있는 값들은 사라지는데
개행문자는 사라지지 않고 입력 버퍼에 남아있게됩니다.
그렇게 되면 cin.getline()은 입력을 받을때 입력 버퍼에 남아있는 개행문자인 '\n'을 읽게되고 콘솔로 입력을 받기전에
'\n'을 읽은 후 입력을 받았다고 판단하여 '\n'만 읽은후 코드를 넘겨버립니다.
(cin.getline은 cin과 다르게 '\n'까지 읽으며 cin은 '\n'직전까지 읽습니다.)
이럴때, 해결방법은 cin.ignore()을 사용하여, 버퍼에 있는 모든 내용을 제거하게 되어 cin.getline() 가 제대로 작동하게 되는 것입니다.
위 코드를 실행하게 되면 textCase 변수와 str 변수의 입력을 받을 것 같지만 예상과는 달리 textCase 만 입력을 받고 프로그램을 종료하게 됩니다.
그 이유는 앞에서 설명한것 처럼 textCase를 입력했을때 입력버퍼에 '\n'가 남아 있기 떄문에 cin.getline()에서 str 변수를 입력 받으려 할때 '\n'이 들어가 입력이 넘어간 것 입니다.
위 사진과 같이 입력 후 앞에 cin.ignore()을 사용하여 버퍼를 초기화 해주면 이제야 제대로 실행되는걸 볼수가 있습니다.
입력 받은 후에 버퍼를 초기화를 해주는 방법이 기본적인 방법이기에 사용을 하면 초기화를 시켜주는 버릇을 들이는게 좋을것 같습니다.
'프로그래밍 > C,C++' 카테고리의 다른 글
[C++]람다 표현식(Lambda Expression) 정리 (0) | 2024.02.04 |
---|---|
C++ 동적 라이브러리 만들기 (1) | 2023.01.03 |
C++ 정적 라이브러리 만들기 (0) | 2023.01.03 |
C 평가 순서 [unspecified, undefined, Sequence Point] (1) | 2022.12.30 |