Programming/C++
[C++] getline을 이용해 입력받을 때 cin.ignore로 버퍼비우기
감성적인 개발자
2022. 6. 24. 00:02
백준에서 간단한 문제를 풀던 중 C++로 알고리즘을 해결할 때 알아두면 유용한 정보를 찾아 기록해놓기로 했다.
4458번: 첫 글자를 대문자로
첫째 줄에 줄의 수 N이 주어진다. 다음 N개의 줄에는 문장이 주어진다. 각 문장에 들어있는 글자의 수는 30을 넘지 않는다. 모든 줄의 첫 번째 글자는 알파벳이다.
www.acmicpc.net
getline() 입력받기
C++에서 스트링을 입력받을 땐 std::cin을 이용해 입력받는다. 하지만 입력받는 스트링이 공백을 포함할 때, 예를 들어 "Hello World C++"라는 스트링을 하나의 변수에 저장하기 위해선 getline()을 이용해 입력받아야한다.
string s;
getline(cin, s);
하지만 getline이 호출되기 전 받는입력이 있다면, 버퍼에 개행문자가 남아있어 '\n'이 getline에 바로 입력되어버리는 현상이 발생한다. 이 때 cin.ignore을 이용한다면 버퍼를 비울 수 있다.
int n;
string s;
cin >> n;
getline(cin, s); // '\n'이 바로 입력으로 들어간다
cout << n << '\n'; //n 값 출력
cout << s << '\n'; //개행처리
cin.ignore()를 이용해 푼 4458번 문제
그런데 버퍼를 비운다는 개념으로 알고 사용했으나, 조금 더 알아본 결과 앞 글자 n개를 지운다는 개념을 적용하는게 더 적합하다고 할 수 있겠다. 위의 예시에서 cin.ignore()의 인자로 cin.ignore(3)을 주었을 때 실행 결과는 다음과 같다.
#include <iostream>
using namespace std;
int main() {
int n;
string s;
cin >> n;
cin.ignore();
for(int i = 0; i < n; i++){
getline(cin, s, '\n');
s[0] >= 97 ? s[0] -= 32 : s[0];
cout << s << '\n';
}
}
cin.ignore(n) 예시
cin.ignore(4)를 주었기 때문에 앞의 4 글자(개행 포함)가 지워진 뒤, s를 입력받게된다. 알고리즘을 풀이할 때는 인자를 줄 일이 거의 없을 것 같지만 버퍼를 비운다는 개념과는 상이하단 것은 알고 사용해야겠다.
int n;
string s;
cin >> n;
cin.ignore(4);
getline(cin, s);
cout << s << endl;