cin
- <iostream> 에 포함되어 있다.
- 표준 입력 버퍼에서 개행 문자를 제외한 값을 가져온다.
- 공백이나 개행 입력 시 공백 이전까지의 값만 결과로 받아들인다.
- 개행 문자를 입력 버퍼에 남겨둔다.
즉, cin으로 입력을 받게되면 공백문자에서 입력을 끊는다.
이러한 문제를 해결하기 위해서는 getline()이라는 함수를 사용해야한다.
getline()
getline()함수는 아래 두가지 라이브러리에 있다.
1. #include<istream>
2. #include<string>
istream에는 cin.getline()이 들어있다.
- 문자 배열이며 마지막 글자가 '\0'(terminator)인 c-string을 입력 받는데 사용
- n-1개의 문자 개수만큼 읽어와 str에 저장 (n번째 문자는 NULL('\0')로 바꾼다.)
- 세번째 인자인 dlim은 별도로 지정해주지 않으면 엔터('\n')로 인식한다.
- dlim을 지정해주면 그 제한자(dlim)문자 직전까지 읽어서 str에 저장해준다.
cin.getline(char* str, streamsize n);
cin.getline(char* str, streamsize n, char dlim);
string에는 getline()
- 최대 문자 수를 입력하지 않아도 된다.
- 원하는 구분자(delimiter)를 만날 때 까지 모든 문자열을 입력 받아 하나의 string 객체에 저장한다.
cin.getline(변수명, 숫자); 형식으로 사용할 수 있는데
숫자만큼 입력을 받아 변수명에 넣어라가 된다.
cin.getline(name, 10); 로 사용한다면 name이라는 변수에 10자를 넣어라는 뜻이 되겠다.
** string의 getline() 사용시 주의사항
int n;
string str;
cin >> n;
getline(cin, str);
위와 같은 상황일때, 위 코드대로 실행을 하면 n을 입력 받은 후 문자열을 입력받지 않고 바로 다음 코드로 넘어가게 된다.
이유는 버퍼에 정수 값을 입력한 뒤 누른 엔터('\n')가 그대로 남아있어 getline()에 들어가기 때문이다.
이를 해결하기 위해 cin.ignore()라는 함수를 사용할 수 있다.
int n;
string str;
cin >> n;
cin.ignore();
getline(cin,str);
위와 같이 cin >> n을 입력 받은 뒤
cin.ignore()를 통해 버퍼의 내용을 지운다. 그렇게 하면 getline()이 정상 동작하는 모습을 볼 수 있다.
cin.ignore()는 아래와 같은 형태로도 사용이 가능하다.
cin.ignore(int a, char b);
a : 읽어들일 문자의 개수
b : 종결 문자
cin.get()
- 표준 입력 버퍼에서 문자를 하나만 가져온다.
- 문자 하나만 입력이 가능하며 공백과 개행도 입력으로 포함한다.
char ch1, ch2;
ch1 = cin.get();
ch2 = cin.get();
좀더 자세한 내용은 아래 블로그를 참조하자.
https://kyu9341.github.io/C-C/2020/01/17/C++getline()/
'프로그래밍 > C,C++' 카테고리의 다른 글
[Mac M1]mkdir: bits Permission denied 오류 해결_#include<bits/stdc++.h> (0) | 2023.10.28 |
---|---|
[c++] string::substr 사용법 (0) | 2023.10.26 |
C언어와 C++의 차이점이 무엇이 있을까? (1) | 2023.10.25 |
자료형(정수형, 실수형) 범위를 알아보자 (0) | 2023.09.24 |
c++ string::find() , string에서 특정 문자열을 찾아내는 함수 (0) | 2023.07.18 |