04
18
728x90

c++에는 입력받는 방법이 여러 가지 있는데, 그 중 키보드로 사용자에게 입력받는 방법 중, c언어 형태의 입력이 아닌 c++형태의 입력 방법 몇 가지를 알아보고자 한다.


1. cin

가장 흔하게 사용하는 std::cin이다.

#include <iostream>

using namespace std;

int main() {
    char a[10];

    cin >> a;   // "hello lee" 입력
    cout << a;

    return 0;
}

위처럼 C언어에서 다루는 문자열처럼 char에 입력을 받는다고 할 때, "hello lee"같이 띄어쓰기가 있는 경우, 띄어쓰기도 입력 종료의 한 부분으로 판단 해 배열 a에는 "hello"만 들어가고, 출력도 "hello"만 되는 것을 볼 수 있다.

char배열이 아닌 string으로 해도 마찬가지이다.

 

즉, 공백과 개행문자를 입력받을 수 없다.

참고로 cin은 처음 입력 된 띄어쓰기, 탭, 개행문자는 무시한다.


2. get

해당 메소드는 std::istream::get이며, 문자만 입력받거나 문자열로 입력받을 수 있다.

프로토타입은 istream& get(char* s, streamsize n, char delim); 이다.

s: 문자열을 받을 배열을 가리키는 포인터

n: 저장할 문자의 최대 갯수

delim: 제한자로, 지정한 문자가 나타나면 입력을 멈춘다. 대신 제한자는 저장하지 않는다.

 

n을 빼면 문자만 입력받을 수 있다.

delim을 빼면 개행문자(엔터)로 자동 설정 된다.

n을 뺐다면 문자열이 아닌 문자를 입력받기에, delim도 설정할 수 없다.

 

즉, 문자를 입력받기 위해서는 인자로 s만 주면 되고, 문자열을 입력받기 위해서는 n과 delim을 추가하면 된다.

include <iostream>

using namespace std;

int main() {
    char a, b, c;

    cin.get(a);
    cin.get(b);
    cin.get(c);

    // a는 'a', b는 ' ', c는 b가 들어있음
    cout << a << ' ' << b << ' ' << c; 

    return 0;
}

문자만 입력 받을 수 있게 해보자. char타입으로 변수 3개를 만든다.

각자 cin.get()을 사용 해 a, b, c 변수에 'a', 'b', 'c'를 넣기 위해서 "a b c"라고 입력한다.

근데 a, b, c를 출력 해 보니 "a b"라고 출력된다.

cin과 다르게 ' '(띄어쓰기)가 입력 종료가 아닌 문자로 받아들여서 b에 ' '가 들어간 것이다.

 

아래는 문자가 아닌 문자열로 입력받는 경우이다.

#include <iostream>

using namespace std;

int main() {
    char a[10];

    cin.get(a, 10, '.');    

    cout << a << '\n';

    return 0;
}

"hello lee.qwe"를 입력했고, 제한자인 '.'을 만나고 저장하기를 멈춘다.

또한 cin과 다르게 ' '(띄어쓰기)또한 문자로 인식 해 저장되는 것을 볼 수 있다.

 


3. getline

- getline은 두 가지의 형태가 있다.

- std::istream::getline의 cin.getline()과 std::getline(string)이다.

 

std::istream::getline의 cin.getline()

프로토타입은 itream& getline(char* s, streamsize n, char delim); 이다.

s: 문자열을 받을 배열을 가리키는 포인터

n: 저장할 문자의 최대 갯수

delim: 제한자로, 지정한 문자가 나타나면 입력을 멈춘다. 대신 제한자는 저장하지 않는다.

제한자를 지정하지 않을 수도 있는데, 그렇다면 개행문자(엔터)로 자동 설정 된다.

#include <iostream>

using namespace std;

int main() {
    char a[20];

    cin.getline(a, 15, '.');

    cout << a << '\n';

    return 0;
}

위처럼 "hello lee.qqq"를 입력했지만, 제한자인 '.'을 만나고 저장하기를 멈춘다.

또한 cin과 다르게 ' '(띄어쓰기)또한 문자로 인식 해 저장되는 것을 볼 수 있다.

 

참고로 cin.getline()의 첫 인자는 문자열을 받을 배열의 포인터이기에 string타입에 입력받으려고 하면 안된다.

 

그 때 두 번째의 getline을 사용하면 된다.

std::getline(string)

프로토타입은 istream& getline(istream& is, string& str, char delim); 이다.

is: 문자들이 추출되어질 istream(입력 스트림)오브젝트(키보드 입력을 받을거면 cin 쓰면 된다.)

str: 입력받은 문자열들이 저장될 string 오브젝트

delim: 제한자로, 지정한 문자가 나타나면 입력을 멈춘다. 대신 제한자는 저장하지 않는다.

제한자를 지정하지 않을 수도 있는데, 그렇다면 개행문자(엔터)로 자동 설정 된다.

#include <iostream>

using namespace std;

int main() {
    string str;

    getline(cin, str, ';');

    cout << str << '\n';

    return 0;
}

이번에는 제한자를 ';'로 설정했다. "hello lee;qqq"를 입력하고, 제한자인 ';'을 만나고 저장하기를 멈춘다.

이번에도 cin과 다르게 ' '(띄어쓰기)또한 문자로 인식 해 저장되는 것을 볼 수 있다.

 

해당 형태의 getline메소드는 두 번째 인자로 string타입을 넣어야하기에 char배열은 안된다.


결론

cin은 입력받기에 편한 메소드지만, 공백이 포함된 문자열을 받기에는 부적절하니, get, getline 메소드를 적절하게 활용하는 것이 좋다.

 

 

참고

std::istream::get

https://www.cplusplus.com/reference/istream/istream/get/?kw=istream%3A%3Aget 

std::istream::getline

https://www.cplusplus.com/reference/istream/istream/getline/

std::getline(string)

https://www.cplusplus.com/reference/string/string/getline/

728x90
COMMENT