cin과 getline(), 그리고 cin.ignore()
cin 객체
- <iotream> 헤더파일에 포함된 입력 스트림 객체이다.
- 공백, 탭, 엔텉와 같은 화이트 스페이스 문자를 무시하고 입력 받지만, 이 문자들은 버퍼에 그대로 남아있다는 점을 유의한다.
#include <iostream>
using namespace std;
int n;
string s;
int main() {
cin >> n;
cout << n << '\n';
cin >> s;
cout << s << '\n';
return 0;
}
cin은 공백 이전까지만 입력을 받기 때문에, 공백을 포함해서 입력 받을 수 없다. 공백을 포함해서 입력을 받으려면 getline함수를 사용하면 된다.
getline()
getline()은 기본적으로 개행 문자 ('\n')를 줄의 끝으로 인식하고 개행 문자 직전까지 입력을 받는다. 만약 다른 종결 문자를 사용하고 싶다면, 이를 세 번째 인자로 전달하면 된다.
getline(cin, s, '.'); // .을 끝으로 인식하고 싶은 경우
getline으로 입력 받을 경우, 주의할 점이 있다. cin으로 n개의 getline을 받을지 설정하고 getline의 입력이 들어오는 상황이 있다. 그럴 때는 버퍼를 지워주고 입력을 받아야 한다. 그 이유는 cin으로 입력을 받을 때 개행문자 직전까지 입력을 받게 되고, 이 때문에 중간에 위치한 버퍼에 \n이 남아있게 된다. 버퍼의 개행문자를 없애주기 위해 getline으로 다른 문자를 받아주거나, 입력 버퍼를 비워주는 cin.ignore()를 용할 수 있다.
#include <iostream>
#include <string>
using namespace std;
int n;
string s;
int main() {
cin >> n;
cin.ignore();
for(int i = 0; i < n; i++){
getline(cin, s);
cout << s << '\n';
}
}
'C++' 카테고리의 다른 글
[C++] 소수점 고정 시 반올림 오류와 부동 소수점 오차 (0) | 2024.08.13 |
---|---|
[C++] 소수점 고정 출력과 cout << fixed, cout << setprecision(), cout.precision() (0) | 2024.08.13 |
[C++] 참조(reference)와 복사(copy)의 차이 (0) | 2024.07.25 |
[C++] terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc (0) | 2024.05.21 |
[C++] endl과 '\n'의 차이 (0) | 2024.04.23 |