[C++] 문자열 입력 받기

E woo·2022년 7월 19일
0

개발 일기

목록 보기
7/15

문자열


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 이용하기


getline 은 istream 라이브러리에 속해있는 cin.getline
string 라이브러리에 속해있는 getline 이 존재 한다.

둘 다 모두 기본적으로는 마지막이 널 문자 \n 인지를 판단하여 문자열을 구분하기 때문에
공백이 포함된 문자열을 입력으로 받을 수 있다.

다만 이 두 가지의 사용은 차이점이 있다.

istream cin.getline

우리가 흔히 사용하는 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 getline

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' 을 제거했기 때문에 정상적으로 문자 하나와 문자열 하나를 입력받을 수 있다.

cincin.getline 사용 시에도 마찬가지다.

cin.getline 과 getline은 입력을 받고 해당 문자열을 모두 버퍼에서 제거하여 getline은 여러 번 사용해도 문제가 없는 듯 하다.
profile
뒘벼

0개의 댓글