C++ 에서는 기본적으로 string
타입의 변수 선언이 가능하고 입력과 출력 cin
, cout
으로 가능하다.
#include <iostream>
using namespace std;
int main()
{
string str;
cin >> str;
cout << str;
return 0;
}
그러나 cin
은 공백이 입력으로 들어오는 순간 문자열의 끝이라고 판단하여 더 이상의 입력을 받지 않게 된다. 예를 들어 입력으로 Helo World!
치게 되면 Hello와 World 사이의 공백을 문자열의 끝으로 인식하여 Hello 만 입력받게 된다.
따라서 공백이 있는 문자열을 입력 받기 위해서는 다른 방법이 필요하다.
getline
은 istream 라이브러리에 속해있는 cin.getline
과
string 라이브러리에 속해있는 getline
이 존재 한다.
둘 다 모두 기본적으로는 마지막이 널 문자 \n
인지를 판단하여 문자열을 구분하기 때문에
공백이 포함된 문자열을 입력으로 받을 수 있다.
다만 이 두 가지의 사용은 차이점이 있다.
우리가 흔히 사용하는 iostream은 input에 대한 istream, output에 대한 ostream을 모두 가지고 있기 때문에 다른 헤더의 추가 없이 iostream으로 cin.getline
을 사용할 수 있다.
cin.getline (char* s, streamsize n, char delim);
cin.getline의 형식은 다음과 같다.
첫번째 인자로 char 배열의 시작점을
두번째 인자로 저장할 문자열의 크기를 (마지막 인자인 '\n' 까지 생각하여 n-1의 문자를 저장한다.)
세번쨰 인자로 제한자 혹은 구분 문자로 해당 문자가 들어온 경우 문자열의 끝으로 간주한다.
(세번째 인자를 생략하면 기본적으로 '\n' 문자가 default로 지정된다.)
char s[100];
cin.getline(s, 100);
string 라이브러리에 속해있으므로 include <string>
이 필요하고
istream& getline (istream& is, string& str, char delim);
getline의 형식은 다음과 같이 cin.getline
과 유사하지만 문자열의 크기를 지정하지 않아도 된다.
첫번째 인자로는 입력스트립 객체로 cin
을 넣어 표준입력으로 사용한다.
두번째 인자로는 string 변수의 시작점을
세번째 인자로는 제한자 혹은 구분 문자를 넘겨준다.
string str;
geline(cin,str);
getline
사용 시 주의할 점은 cin
과 같이 사용할 경우 cin
으로 입력을 받은 후에 버퍼에
'\n' 이 남아있기 때문에 그 다음 getline
을 통해 문자열을 받게되면 바로 '\n' 이 해당 입력 값으로 들어가 잘못된 동작이 될 수 있다.
char a;
cin >> a;
string str;
getline(cin,str);
cout << a << endl;
cout << str;
위의 코드를 실행 시 문자 하나 입력 후 문자열을 입력할 수 있기 기대하지만
문자 입력 후 바로 널문자가 getline으로 넘어가 프로그램은 바로 종료된다.
이러한 현상이 발생하는 이유는 cin
은 입력을 받고 해당 값들을 변수에 넘겨줄때 마지막
널문자 '\n' 는 버퍼에 남겨둔 채로 놔두기 때문에 해당 버퍼를 비워줄 필요가 있다.
이를 위해 cin.igore()
버퍼에 있는 널문자 하나를 없애준다.
char a;
cin >> a;
cin.ignore();
string str;
getline(cin,str);
cout << a << endl;
cout << str;
cin.ignore()
을 통해 버퍼에 있는 '\n' 을 제거했기 때문에 정상적으로 문자 하나와 문자열 하나를 입력받을 수 있다.
cin
과 cin.getline
사용 시에도 마찬가지다.