https://makedotworld.tistory.com/29
위의 글을 참고하여 포스팅합니다.
[C++] C++에서 문자열 줄단위로 받기
알고리즘 문제를 풀면서 Input을 벡터 파라미터로 주는것이 아니라 문자열로 주는 경우, 또는 문자열 자체를 처리하는 알고리즘인 경우에 C++로 풀어야 되는경우, 익숙하지 않으면 문자열을 읽
makedotworld.tistory.com
위의 글을 통해서 cin의 경우에는 첫번째 개행문자(\n)는 무시하지만
getline의 경우에는 개행문자를 포함해서 읽는다는 점이었다.
Codeground에서 연습문제를 풀고 있었는데 띄어쓰기를 포함해서 여러개의 문자열을 받으려고 하는데
cin으로 문자열의 개수를 n으로 받은 후 다음과 같이 하려고 하니 문제가 생겼다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <iostream>
#include <string>
using namespace std;
int main(){
int n;
cin >> n;
for(int i=0; i<n; i++){
string str;
getline(cin, str); // getline(cin, str, '\n')과 같음
cout << str << endl;
}
}
|
cs |
cin은 띄어쓰기나 개행문자를 무시하고 그전까지 읽는다.
위와 같이 getline(cin, str)을 이용하면 띄어쓰기를 모두 str에 포함시켜 저장하고 개행문자가 나올때까지 읽는다.
이 글을 보는 여러분도 한번 위와 같은 코드를 작성해본다면 당황하게 될 것이다. n 을 입력하고 엔터를 치면
신기하게도 한줄이 더 띄어진다. 이는 바로 getline은 개행문자 까지 읽지만 cin은 개행문자 전까지 읽기 때문이다.
그래서 무슨 현상이 일어난 것이냐면
예를 들어 n이 2라고 한다면 2를 치고 나서 누른 엔터키(\n) 개행문자가
for문의 i=0인 경우의 getline으로 읽혀서 str = '\n'이 되는 것이다.
즉 이런 문제를 해결하기 위해서는 for문의 앞에 getline(cin,str)를 한번 더 써줘서
이 개행문자를 한번 무시해주면 되지 않을까 싶다.(물론 이런 경우 str의 선언을 for문의 밖에서 미리 해줘야겠지만!)
암튼 또 오늘 새로운 걸 배워서 간단하게나마 공유해본다!!!
'Baekjoon(C++)' 카테고리의 다른 글
[C++]백준 알고리즘 11729번 (0) | 2021.07.18 |
---|---|
[C++]백준 알고리즘 2447번 (1) | 2021.07.18 |
[C++]백준 알고리즘 1316번 (0) | 2021.07.14 |
[C++]백준 알고리즘 2908번 (0) | 2021.07.14 |
[C++]백준 알고리즘 1157번 (0) | 2021.07.14 |