[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
'Archive2 > C&C++' 카테고리의 다른 글
[C++] #2 함수 오버로딩 (Function Overloading) 과 디폴트 값 (defalut value) (0) | 2021.08.20 |
---|---|
[C++] #1 입출력 방식 cin / cout / endl (0) | 2021.08.20 |
[C++STL] max_element , min_element - 배열/벡터에서 최대,최소 찾기 (0) | 2021.07.06 |
[C++ STL] Deque Container 사용 방법 & 관련 예제 총 정리 (0) | 2021.05.10 |
[C++ STL] sort 정렬 함수 사용 방법 정리 (오름차순 & 내림차순) (0) | 2021.05.09 |