오늘은 공백을 포함한 문자열을 입력 받기 위해 getline 함수를 활용하는 방법을 공부한다. 그리고 getline 함수로 데이터를 입력 받고 출력할 때 입력한 문자가 출력되는 것이 아닌 개행이 되는 이유를 알아보고 ignore 함수를 어떻게 적용하는지 알아본다.
문자를 입력 받기 위해서는 문자형 변수를 생성하고 cin이나 scanf를 통해서 변수에 입력을 한다. 문자형 변수로 많이 쓰는 데이터 타입은 char형이나 string이다. 두 가지 예시를 들어보면 아래와 같다.
1. char형 변수를 생성하여 문자열 입력 받기
char c[100];
cin >> c;
char형 변수 c를 배열로 생성하여 여러 개의 문자를 입력 받거나 포인터를 활용하는 방법이 있다.
2. string형 변수를 생성하여 문자열 입력 받기
string str;
cin >> str;
string형 변수 str을 생성하여 바로 입력을 받는다. string형은 원래 문자열을 입력 받을 수 있는 데이터 타입이기 때문에 배열로 선언하지 않는다.
위처럼 데이터를 입력 받는 과정은 간단하다. 그런데 공백을 포함한 문자열을 입력 받는다면 어떻게 될까? 바로 아래와 같은 오류가 발생하게 된다.
공백을 포함한 문자열 입력 시 발생할 수 있는 오류
공백을 포함하여 위와 같은 변수에 데이터를 입력 하게 되면 공백 이후의 데이터가 저장되지 않는다. 우리가 cin을 사용할 때 입력 할 문자가 끝나면 엔터 키를 눌러 입력을 종료하듯이 스페이스바를 인식하게 되면 그 이후로 데이터는 입력되지 않는다. 그래서 우리는 아래와 같은 방법을 활용해야 한다.
getline 함수
getline 함수는 공백을 포함한 문자열을 입력받을 수 있는 함수이다.
string str;
getline(cin, str);
이렇게 작성하면 str에 공백을 포함한 문자열을 입력할 수 있다. 그런데 getline 함수도 오류가 발생할 수 있다는 사실!
int num;
cin >> num; //5 입력 가정
string str;
getline(cin, str); // 1 2 3 4 5 입력 가정
cout << num << endl;
cout << str << endl;
그냥 보기에는 간단한 코드이다. num에 정수를 입력 받고 str에 문자열을 입력 받는다. 그런데 이 코드에서 str에 입력하기 위해 입력한 문자열이 출력되지 않는다. 출력 결과는 아래와 같다.
5
num에 입력한 5 이후로 str에 저장하기 위해 입력한 데이터가 출력되지 않는다. 그 이유는 무엇일까? 바로 str에 개행문자가 입력되었기 때문이다. cin 으로 num에 데이터를 입력하면서 발생한 개행문자가 버퍼에 저장되어 있다가 getline으로 입력을 받을 때 str에 저장이 되는 것이다. 그래서 str만 선언하고 getline으로 입력을 받을 때와는 달리 이런 오류가 발생하는 것이다. 이것을 해결하기 위해서는 앞선 cin에 대해 ignore 함수를 적용해 주어야 한다.
int num;
cin >> num;
cin.ignore();
string str;
getline(cin, str);
cout << num << endl;
cout << str << endl;
이렇게 작성하면 앞선 num의 입력 후에도 정상적으로 str이 입력 된다. num을 입력하고 저장된 '\n' 문자를 저장하지 않고, 바로 다음에 입력한 문자열이 저장된다.
이번 학습을 통해서 알 수 있는 것은 cin으로 인한 입력 이후에 엔터키를 통해 입력 종료를 하면 버퍼에 개행 문자가 남는다는 것과 그대로 getline 함수로 데이터를 입력 받으면 버퍼에 남아있던 개행 문자를 먼저 입력 받는 것이다. 이 때 ignore를 통해서 지정한 문자의 개수 만큼 버퍼의 내용을 비우고 getline 사용 시 원하는 문자부터 저장할 수 있도록 구현이 가능하다.
'C++' 카테고리의 다른 글
15649 C++ 백트래킹 문제 풀이 (1) | 2024.02.06 |
---|---|
10872 C++ 팩토리얼 문제 풀이 (0) | 2024.02.05 |
C++ 가상 함수 공부하기 - virtual 함수 (2) | 2023.05.23 |
C++ char형 배열 출력하기 (0) | 2023.05.22 |
C++ char형 배열을 쓰는 이유 (0) | 2023.05.17 |