[C++] cin, getline 함수로 입력 받기

leeeha·2021년 11월 7일
1

C++

목록 보기
4/7

참고 자료

cin 객체

  • <iostream> 헤더파일에 포함된 입력 스트림 객체이다.
  • 공백, 탭, 엔터와 같은 화이트 스페이스 문자를 무시하고 입력 받지만, 이 문자들은 버퍼에 그대로 남아 있다는 점을 유의해야 한다.
#include <iostream>
using namespace std;

int main() {

	int n;
	cin >> n;
	cout << n << '\n';

	string str;
	cin >> str;
	cout << str << '\n';

	return 0;
}

입력: 12
출력: 12
입력: Hello World!
출력: Hello

cin은 공백 이전까지만 입력을 받기 때문에, 공백을 포함해서 입력 받을 수 없다. 이 문제를 해결하기 위해 getline 함수를 사용할 수 있다.

getline 함수

getline 함수는 <istream>에 속한 cin.getline 함수와 <string>에 속한 getline 함수 이렇게 두 가지가 존재한다.

istream의 cin.getline() 함수

cin.getline(char str, streamsize n);
cin.getline(char
str, streamsize n, char dlim);

  • C언어 스타일의 문자열을 입력 받을 때 사용 (char형 배열, 문자열의 끝이 널문자)
  • 크기 n을 지정하면 (n-1)개의 문자를 읽어와 str 배열에 저장 (마지막은 널문자)
  • 지정한 delimiter를 만나기 전까지 모든 문자를 읽어서 str 배열에 저장 (디폴트 구분자는 개행 문자)

string의 getline() 함수

getline(istream& is, string str);
getline(istream& is, string str, char dlim);

  • 입력 가능한 최대 문자 수를 지정하지 않아도 된다.
  • 지정한 delimiter를 만나기 전까지 모든 문자를 읽어서 string 객체에 저장 (디폴트 구분자는 개행 문자)

주의사항

cin은 개행 문자를 버퍼에 그대로 남겨 두기 때문에, 아래 예시처럼 연이어서 바로 다음 입력을 받을 때 버퍼에 있던 개행 문자가 그대로 입력돼버리는 문제가 발생한다.

#include <iostream>
using namespace std;

int main() {
	char a[100], b[100], c[100];
	cin >> a; // cin은 버퍼에 엔터가 남아있음.

	// getline 함수는 버퍼에 엔터 포함X
	cin.getline(b, 100); 
	cin.getline(c, 100);

	cout << "a: " << a << endl;
	cout << "b: " << b << endl;
	cout << "c: " << c << endl;

	return 0;
}

입력

Hello
World

출력

a: Hello
b:
c: World

따라서, 입력 버퍼를 비워주는 cin.ignore() 함수를 사용해야 한다.

#include <iostream>
using namespace std;

int main() {
	char a[100], b[100], c[100];
	cin >> a; // cin은 버퍼에 엔터가 남아있음.
	cin.ignore(); // 입력 버퍼 비우기

	// getline 함수는 버퍼에 엔터 포함X
	cin.getline(b, 100); 
	cin.getline(c, 100);

	cout << "a: " << a << endl;
	cout << "b: " << b << endl;
	cout << "c: " << c << endl;

	return 0;
}

입력

Hi
Hello World
Nice

출력

a: Hi
b: Hello World
c: Nice

profile
습관이 될 때까지 📝

0개의 댓글