프로그래밍/C,C++

C++ 입력 함수 / cin, cin.get(), getline()

gameObject 2023. 10. 26. 13:00
728x90

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++ 입력 함수 - cin, cin.get(), getline() - kwon | kwon's Blog

cin 에 포함되어 있다. 표준 입력 버퍼에서 개행 문자를 제외한 값을 가져온다. 공백이나 개행 입력 시 공백 이전까지의 값만 결과로 받아들인다. 개행 문자를 입력 버퍼에 남겨둔다. 1234567int n;cin

kyu9341.github.io

 

728x90