반응형


 

String 공백 포함 입력 받는 방법

 

  • string과 char[] 자료형 모두 공백이 포함된 입력을 받았을 때, 공백을 기준으로 다른 인자라고 판단하여, 공백 문자가 나오기 이전까지의 문자들만 입력이 되는 문제가 있다.
  • 이를 해결하기 위해서는  cin이나 scanf가 아닌 getline을 통해 값을 받아와야 한다.

 

string str;
getline(cin, str);

 

getline 사용 유의점


  • 기본적으로 cin으로 입력받을 경우, 변수에 '\n'을 저장하지 않으므로 입력 버퍼에 '\n' 찌꺼기가 남게 된다.
  • cin으로 입력받은 후, 또 cin을 활용하여 입력을 받을 때는 이전 버퍼에 있던 '\n'을 무시하고 또 다시 개행문자를 무시하므로 버퍼를 비우지 않아도 정상작동한다.
  • 하지만 cin으로 입력받은 후, 버퍼에 '\n'가 차있는 상태에서 getline을 사용할 경우, '\n'문자로 인해 정상적으로 입력을 받지 못하는 이슈가 있다.
  • 따라서 버퍼를 cin.ignore()을 통해 비워주어야 한다.
  • getline 이후 getline을 사용할 경우엔 변수에 '\n'가 들어가 있기 때문에 버퍼에는 '\n'가 존재하지는 않으므로 문제가 발생하지 않는다. 초보자들이 많이 실수하는 부분이 getline은 반드시 ignore를 해주어야 한다고 착각하는경우인데, '\n'이 존재하지 않는 버퍼를 강제로 ignore로 비울 경우, 맨 앞 문자 1개가 누락된 입력을 받게 된다. 

 

// cin.ignore가 필요한 경우

cin >> N;
string s;
cin.ignore();
getline(cin,s);

// cin.ignore가 필요하지 않은 경우

cin >> N;
cin >> str;
// (버퍼에 남아있는 '\n'을 자동으로 cin이 무시함)

getline(cin,s);
getline(cin,s2);
// ('\n'을 포함하여 변수 s, s2에 저장하므로 버퍼에 '\n'자체가 남아 있을 이유가 없음
반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,