[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