Use of Getline

오늘은 인풋을 받을 때 사용하는 두가지 방법인 cin과 getline에 대해 얘기해보고자 한다.

1) std::cin

cin은 newline character ‘\n’가 들어오면 그 앞까지를 저장한 다음, 인풋 버퍼를 비운다. 기본적인 용례는 다음과 같다.

#include <iostream>
#include <string>

using namespace std;

int main() {

    string name;
    cout << "Enter your name: ";     cin >> name;
    cout << name << endl;

    return 0;

}

컴파일을 한 뒤, 인풋으로 YoungJoong을 준 결과는 다음과 같다.
ex_cin
이번에는 코드를 다음과 같이 수정해보았다.

#include <iostream>
#include <string>

using namespace std;

int main() {

    string name;
    cout << "Enter your name: "; cin >> name;
    cout << name << endl;

    // repeat
    cout << "Enter your name: "; cin >> name;
    cout << name << endl;

    return 0;

}

인풋으로 I’m YoungJoong을 줘보자. 그러면 다음과 같은 이상한 결과물이 나온다.
cin_prob
그 이유는 cin이 I’m까지 저장을 하고 공백문자를 발견하자마자 공백 문자(space)를 지워버렸기 때문이다. 이때 공백문자 뒤의 YoungJoong은 그대로 버퍼에 남아있다. 따라서 다음에는 사용자가 입력을 주지 않았는데도 버퍼안에 남아있떤 YoungJoong이 name으로 들어가 저장이 되는 것이다.

2) std::getline

cin의 위와 같은 문제를 해결하기 위해 사용할 수 있는 것이 바로 getline이다. getline은 space까지 포함하여 입력을 받으며, newline character 나 delimiter를 발견하면 그 앞까지 저장을 하고, 버퍼를 비운다. 사용례는 다음과 같다.

#include <iostream>
#include <string>

using namespace std;

int main() {

    string name;
    cout << "Enter your name: ";
    getline(cin, name);
    cout << name << endl;

    // repeat
    cout << "Enter your name: ";
    getline(cin, name);
    cout << name << endl;

    return 0;

}

실행시켰을 때의 결과물은 다음과 같다. 의도대로 공백문자까지 포함하여 입력을 받고, newline character를 기준으로 버퍼를 비운 모습을 확인할 수 있다.

getline_ex

 

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중