[C++] 입력 함수 정리 - cin / getline() (feat. cin.ignore())

    반응형

     

    [C++] 입력 함수 정리 - cin / getline() (feat.cin.ignore())

    #cin

    #getline()

    #istream cin.getline()

    #string getline()

    *getline() 사용시 주의점

     

    * 개인적인 공부 기록용으로 작성한 글 이기에, 잘못된 내용이 있을 수 있습니다.


    # cin

    <iostream> 헤더에 정의되어 있다.

    표준 입력 버퍼에서 공백 혹은 개행 문자 이전 까지의 값만을 받아들인다.

    #include <iostream>
    int val;
    cin >> val;

    자주 사용되지만 >> 연산자는 "nov blog"와 같은 공백이 포함된 문자열은 nov 까지밖에 입력되지 않는다는 단점이 존재한다. 

    공백문자와 함께 입력받기 위해서는 getline() 함수를 이용해야 한다.


    # getline()

    getline() 함수는 istream 라이브러리에 속하는 cin.getline()과 string 라이브러리에 속하는 getline() 2가지로 나뉜다.

    # istream cin.getline()

    C형식 문자열 방식인 마지막 글자에 'NULL' 문자가 포함된 문자 배열 을 받는데 사용한다.

    N-1개의 문자를 읽어와서 str에 저장하고, 마지막 문자는 자동으로 NULL로 바꾼다.

    세 번째 인자 delim(제한자) 직전까지 읽어서 str에 저장한다. (별도로 지정하지 않으면 개행문자('\n')으로 인식한다.)

    cin.getline(변수 주소, 최대 입력 수, 제한자);

    #include <istream>
    cin.getline(char *s, streamsize n , char dlim);

    # string getline()

    지정한 구분자(delimiter)를 만날 때 까지 문자열을 입력받아 string에 저장한다. 구분자는 따로 지정해 주지 않아도 상관없다. 

    getline(입력 스트림, string 객체 , 구분자);

    #include <string>
    //getline(istream& steam, string str, char dlim);
    string str;
    getline(cin, str);

     

    * string getline() 사용 시 주의점

    string 라이브러리의 getline() 함수를 사용 시 주의해야 할 점이 하나 있다.

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
    	int val;
    	cin >> val;
    	string str;
    	getline(cin, str);
    	cout << val << str << endl;
    }

    위의 예시코드를 실행해 보면, 예상과 달리 정수만 입력받고 프로그램이 종료되어 버린다.

    [출력결과]
    1
    1

    위와 같은 현상이 발생하는 이유는 표준 입력 버퍼에 개행문자 '\n'가 남아 있기 때문이다.

    getline() 코드 앞에 cin.ignore() 함수로 버퍼를 클리어 해 주면 문제가 해결된다.

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
    	int val;
    	cin >> val;
    	cin.ignore(); // buffer clear
    	string str;
    	getline(cin, str);
    	cout << val << str << endl;
    }
    [출력결과]
    1
    hello
    1hello

     

    반응형

    댓글

    Designed by JB FACTORY