[C++] std::cin, getline()

2021. 2. 22. 19:42Study/C&C++

일반적으로 C++에선 cin과 getline()으로 문자열을 입력 받는다.

이글에서

1.cin 으로 std::string 에 문자열을 받는 방법

2.getline 으로 std::string 에 문자열을 받는 방법

3. 둘의 차이와 유의사항, 해결법 (cin.ignore)


std::cin

cin 은 기본적으로 버퍼에서 공백' '으로 구분하여 변수에 넣어준다.

string str1;
cin >> str1;
string str2;
cin >> str2;
//cin >> str1 >> str2; // 입력을 공백 으로 구분하여 각 변수에 들어감

위 코드에서 하나씩 받을때, 같이 받을때 똑같이 공백으로 구분되어 들어간다.

getline()

 <string> 헤더에 포함되어있는 getline() 함수는 버퍼에서 '\n'(개행문자) 까지 입력을 받는다

string str;
getline(cin,str);

string에 공백을 포함한 문자열을 받고 싶을땐 위와같이를 이용하여 cin과 str 을 인자로 넣어준다.

std::string 입력문제점과 cin, getline차이

int n;
string str;
cin >> n;
getline(cin, str);
cout << n << str <<endl;

이처럼 int 형 자료형과 getline을 이용하여 str을 받으려 할때 

숫자와  '\n'를 입력하면 문자열은 받지 않고 숫자만 출력되고 끝난다.

입력한 숫자는 int 형 변수에 들어간후

getline() 함수는 버퍼에 남은 '\n'을 str변수에 넣어 버리고 입력을 종료 시키는 것이다.

 

string str1;
string str2;
cin >> str1;
getline(cin, str2);
cout << str1<< str <<endl;

이와 같은 코드에서도 str1으로 들어온 입력만 출력된후 끝난다.

(+ 입력을 숫자 '\n' 꼴이 아닌 숫자(공백)문자열'\n' 꼴로 하면 숫자' '문자열로 출력된다

== cin은 공백 전까지 입력을 받기 때문에 getline()함수가 버퍼에 남은 공백부터 '\n'까지 str2변수에 넣기 때문이다.)

 

왜 그럴까?

간단한 추론 을 해보면

cin은 버퍼에서 ' '으로 구분하여 변수에 넣는다.

getline()은 버퍼에서 '\n'까지 가져온다,

 

str1만 출력된 이유는 버퍼에 '\n'이 남아있어 getline()이 가져온 것이다.

-> cin은 버퍼에서 '\n'을 가져오지 않는다.

 

cin.ignore()

cin.ignore()은 호출되면 입력 버퍼의 모든 내용이 제거 해주는 함수이다.

 

인자를 넣어줄 수도 있다.

cin.ignore(n,delim)

n : 버퍼에서 추출할 문자 갯수 (보통 32767)

delim : 제한문자.

 

뜻 : 버퍼에서 n개의 문자를 추출하고 비울껀데 delim을 만나면 전까지 만 추출하고 버퍼를 모두 비운다

문제 해결

'\n'까지 입력을 받은후 버퍼를 초기화 시켜서 getline()함수가 '\n'을 받아가지 못하게 하면 된다.

int n;
string str;
cin >> n;
cin.ignore(32767, '\n'); // 입력이 몇개 올지 모르므로 short형 최대숫자
//cin.ignore(numeric_limits<streamsize>::max(), '\n'); // <limits> 내부 버퍼최대사이즈
getline(cin, str);

cin.ignore()을 이용하여 몇개가 들어올지 모를 입력에 대비해 short형으로 나타낼수 있는 최대 숫자 32767 과

입력을 끊어내기 위한 '\n'을 인자로 넣어준다.

 

3줄요약

1.cin은 공백 으로 구분하여 대입 -> 공백은 안받음

2.getline()은 개행 문자 까지

3.cin.ignore로 방지하자.

 

'Study > C&C++' 카테고리의 다른 글

[C++] 다형성,virtual 함수  (2) 2021.03.03
[C++]R-value Reference,move Sementics  (0) 2021.02.20
[C++] l-value,r-value  (0) 2021.02.14
[C++] C -style string , std::string  (0) 2021.02.11
[C++] Stack and Heap(feat. Memory Leak)  (0) 2021.02.11