Programming Language/C/C++

[C/C++] 빈칸을 포함한 문자열 입력 시 오류 해결

깐요 2017. 4. 20. 19:26

아직 하나 밖에 입력안했는데?

사용자의 이름과 좋아하는 디저트를 키보드로 입력받아 그 정보를 화면에 출력하는 프로그램이다

#include <iostream>

using namespace std;

int main()
{
	const int ArSize = 20;
	char name[ArSize];
	char dessert[ArSize];

	cout << "이름을 입력하시오:\n";
	cin >> name;

	cout << "좋아하는 디저트를 입력하시오:\n";
	cin >> dessert;

	cout << "맛있는 " << dessert;
	cout << " 디저트를 준비하겠습니다. " << name << "님!\n";

	return 0;
}


입력해야 하는 값은 2개인데

한 가지 값만 입력하고 끝내버리게 된다

이렇게 되는 이유는 cin 이 문자열의 끝을 인식하는 방법 때문이다

cin 은 빈칸, 탭, 캐리지 리턴과 같은 화이트스페이스가 있으면 그 위치에서 문자열이 끝난 것으로 간주한다

위 예시 같은 경우는 빈칸이 문자열에서의 '\0' 과 같은 역할을 한다

Alistair를 첫 번째 문자열로 읽어 name 배열에 저장하고

Dreeb을 두 번째 문자열로 읽어 dessert 배열에 저장한다


getline()과 get()

이와 같은 현상을 해결하기 위해서 getline() 함수를 이용한다

이는 istream 클래스가 제공한다

비슷한 함수로 get()이 있다

getline()은 개행 문자를 읽고 폐기하는 반면 get()은 입력 큐에 개행 문자를 남겨 둔다


getline()은 입력한 행을 저장할 배열의 이름과 입력받을 문자들, 두 개의 전달인자를 사용한다

20개의 원소를 가진 name 배열에 저장하고 싶다면

cin.getline(name, 20);

과 같은 호출을 사용할 수 있다

이 명령문은 행에 있는 문자들의 개수가 19개까지 있을 때 한 행 전체를 읽어 name 배열에 저장한다


단, get()를 사용할 경우 개행 문자가 시스템 입력 큐에 남아있으므로 get()을 한 번 더 사용하여 읽어야 한다

위와 같은 불편함이 있음에도 get()은 에러 체킹에 용이하므로 사용된다

#include <iostream>

using namespace std;

int main()
{
	const int ArSize = 20;
	char name[ArSize];
	char dessert[ArSize];

	cout << "이름을 입력하시오:\n";
	cin.getline(name, ArSize);        // 개행 문자가 있는 곳까지 읽는다

	cout << "좋아하는 디저트를 입력하시오:\n";
	cin.get(dessert, ArSize).get();

	cout << "맛있는 " << dessert;
	cout << " 디저트를 준비하겠습니다. " << name << "님!\n";

	return 0;
}

320x100