getline 과 cin 으로 같이 입력받을 때 문제점

임시온·2023년 3월 20일
0

cpp

목록 보기
1/1
post-thumbnail

c++ 에서 여러 문자열을 동시에 받거나 , 혹은 정해지지 않은 입력값을 받을 때 cin 과 getline을 활용해서 입력을 많이 받는다. 이때 하다 보면 앞에 문자열 하나가 안 받아지는 그런 경우를 발견할 수가 있다. 그래서 이거 기록하기로 했다.

해결방법

해결 방법은 cin.ignore() 를 사용하면 된다. ignore()란 간단하게 말해서 입력 버퍼를 지우는 것이다. 입력이 다음과 같이 들어온다면
5
R R R U D D

 int n;
 string plan;
 cin >> n;
 cin.ignore(); 
 getline(cin,plan);

이러한 코드를 통해서 입력을 받을 수 있다.

ignore() 사용법

기본 형태

istream& ignore (streamsize n = 1, int delim = EOF);
인자(argument) 는 2개로 첫번째 인자 n 은 제거할 문자 수 를 나타낸다.
두번째로는 제거를 중단할 문자 를 나타내며 기본값으로는 EOF 이다. 여기서 EOF 는 End Of File 의 약자로 말 그대로 파일의 끝을 나타낸다.

사용예시

cin.ignore(); // 하나만 삭제
cin.ignore(10); // 10개 삭제
cin.ignore(10,'\n'); // 10개를 삭제하는데 \n를 만나면 멈춤
cin.ignore(LLONG_MAX,'\n'); // 지울 수 있는거 다 지움 -> 실질적으로 한 줄 다 삭제 하는거

발생이유

cin 은 '\n' 를 처리하지 않고 입력버퍼에 남겨둔다. 그리고 getline이 실행되면 입력버퍼에서 \n을 가져와서 처리를 함. 그래서 입력 버퍼에 있는 개행문자와 겹처서 처리 에러가 나는 거임. \n을 입력 변수에 넣어버리고 입력 제대로 넣은 줄 알고 착각하고 입력을 종료 시켜서 맨 처음에 있는 문자열에 제대로 받아와지지 않는 것이 발생 이유이다.

비슷한 예제

clear()

cin.clear() 하면 스트림이 좋지 않을 때 사용하면 스트림을 좋게 만듬

0개의 댓글