참고 자료
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
cout << n << '\n';
string str;
cin >> str;
cout << str << '\n';
return 0;
}
입력: 12
출력: 12
입력: Hello World!
출력: Hello
cin은 공백 이전까지만 입력을 받기 때문에, 공백을 포함해서 입력 받을 수 없다. 이 문제를 해결하기 위해 getline 함수를 사용할 수 있다.
getline 함수는 <istream>에 속한 cin.getline 함수와 <string>에 속한 getline 함수 이렇게 두 가지가 존재한다.
cin.getline(char str, streamsize n);
cin.getline(char str, streamsize n, char dlim);
getline(istream& is, string str);
getline(istream& is, string str, char dlim);
cin은 개행 문자를 버퍼에 그대로 남겨 두기 때문에, 아래 예시처럼 연이어서 바로 다음 입력을 받을 때 버퍼에 있던 개행 문자가 그대로 입력돼버리는 문제가 발생한다.
#include <iostream>
using namespace std;
int main() {
char a[100], b[100], c[100];
cin >> a; // cin은 버퍼에 엔터가 남아있음.
// getline 함수는 버퍼에 엔터 포함X
cin.getline(b, 100);
cin.getline(c, 100);
cout << "a: " << a << endl;
cout << "b: " << b << endl;
cout << "c: " << c << endl;
return 0;
}
입력
Hello
World
출력
a: Hello
b:
c: World
따라서, 입력 버퍼를 비워주는 cin.ignore() 함수를 사용해야 한다.
#include <iostream>
using namespace std;
int main() {
char a[100], b[100], c[100];
cin >> a; // cin은 버퍼에 엔터가 남아있음.
cin.ignore(); // 입력 버퍼 비우기
// getline 함수는 버퍼에 엔터 포함X
cin.getline(b, 100);
cin.getline(c, 100);
cout << "a: " << a << endl;
cout << "b: " << b << endl;
cout << "c: " << c << endl;
return 0;
}
입력
Hi
Hello World
Nice
출력
a: Hi
b: Hello World
c: Nice