2021. 2. 22. 19:42ㆍStudy/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 |