cin과 getline의 차이, 그리고 cin.ignore()의 필요성
C++에서 입력을 받을 때, 우리는 주로 cin과 getline을 사용합니다. 하지만 이 두 입력 방식에는 중요한 차이가 있으며, 함께 사용할 때 발생하는 문제를 해결하기 위해 cin.ignore()가 필요할 때도 있습니다. 이번 글에서는 cin, getline의 차이와 cin.ignore()의 사용 이유에 대해 정리해보겠습니다.
1. cin과 getline의 차이점
1) cin
- cin은 공백을 기준으로 데이터를 입력받습니다. 즉, 공백(스페이스, 탭, 개행 문자)을 기준으로 하나의 단어만 받아옵니다.
- 예를 들어, 아래와 같이 사용하면:
string s; cin >> s;
- 사용자가 "Hello, World!"라고 입력했을 때, s에는 "Hello,"만 저장됩니다. 공백 이후의 "World!"는 입력에서 제외됩니다.
2) getline
- getline은 공백을 포함하여 한 줄 전체를 입력받습니다. 즉, 개행 문자 \n이 나올 때까지 모든 입력을 받아옵니다.
- 예를 들어:
string s;
getline(cin, s);
- 위 코드에서 사용자가 "Hello, World!"라고 입력하면, s에는 "Hello, World!"가 그대로 저장됩니다.
차이점 요약:
- cin: 공백 단위로 나눠 입력받으며, 한 번에 하나의 단어만 저장.
- getline: 공백을 포함한 한 줄 전체를 저장.
2. cin.ignore()의 필요성
1) 문제의 발생 원인
cin과 getline을 함께 사용할 때 문제가 발생할 수 있습니다. 예를 들어, 정수를 입력받기 위해 cin >> n;을 사용하고, 이어서 한 줄 전체의 입력을 받고 싶을 때 getline()을 사용하면, getline이 빈 값을 반환하는 문제가 발생할 수 있습니다.
int n;
cin >> n; // 정수 입력
string s;
getline(cin, s); // 빈 문자열을 받음
이 문제는 cin >> n; 이후에 남은 개행 문자(\n) 때문입니다. cin >>는 정수만 읽고 나머지 개행 문자를 입력 버퍼에 남기는데, getline은 이 남아 있는 개행 문자를 읽어 빈 문자열을 반환합니다.
2) 해결 방법: cin.ignore()
이 문제를 해결하기 위해 **cin.ignore()**를 사용하여 남은 개행 문자를 버릴 수 있습니다. cin.ignore()는 입력 버퍼에 남아 있는 문자를 무시하는 역할을 합니다.
int n;
cin >> n; // 정수 입력
cin.ignore(); // 남아 있는 개행 문자 제거
string s;
getline(cin, s); // 이제 제대로 한 줄 입력 가능
이제 getline은 정상적으로 한 줄 전체의 입력을 받습니다.
3. cin.ignore() 사용법
string s;
cin.ignore();
4. 요약
- cin: 공백을 기준으로 데이터를 나누어 입력받으며, 한 단어만 저장.
- getline: 공백을 포함해 한 줄 전체를 입력받음.
- cin.ignore(): cin >>와 getline을 연속으로 사용할 때, 입력 버퍼에 남은 개행 문자를 무시하기 위해 사용.
cin과 getline을 함께 사용할 때 발생할 수 있는 문제를 방지하려면, cin.ignore()를 적절히 사용하는 것이 중요합니다.
'알고리즘' 카테고리의 다른 글
C++ 소수 찾기 알고리즘 2가지 (0) | 2024.09.29 |
---|---|
C++ - (최대공약수,최소공배수 구하기) 유클리드 호제법 알고리즘 (0) | 2024.09.28 |
[알고리즘] 배낭 정리 문제 (0) | 2024.09.20 |
문자열 길이 연산 시 size_t와 int 타입 주의사항 (3) | 2024.09.16 |
C++ : 해쉬를 통해 좌표가 있는지 판단할 때., set과 unordered_set자료구조에 대한 이해의 필요성 (0) | 2024.05.21 |