C++ - cin과 getline()
데이터 읽는 방식
cin : cin은 공백이나 개행 문자('\n')를 기준으로 데이터를 구분하여 읽는다.
getline : getline은 개행 문자('\n')를 기준으로 데이터를 읽어온다.
int age; string name;
cout << "Enter your age and name : ";
cin >> age >> name;
// 예시 입력: 25 John Doe
// age에는 25가 들어가고, name에는 "John"만 들어가게 됨
cout << "=====================================" << endl;
string fullName;
cout << "Enter your full name: ";
getline(std::cin, fullName);
// 예시 입력: John Doe
// fullName에는 "John Doe"가 들어가게 됨
개행 문자 처리
cin : cin은 개행 문자를 읽고, 버퍼에 남겨둔다.
getline : 개행 문자를 읽은 후, 제거하기 때문에 버퍼에 남지 않는다.
int num;
char ch;
cout << "Enter a number and a character: ";
cin >> num >> ch;
// 예시 입력: 42 A
// num에는 42가 들어가고, ch에는 'A'가 들어가지만 '\n'은 버퍼에 남게 됨
string sentence;
cout << "Enter a sentence: ";
getline(std::cin, sentence);
// 예시 입력: Hello World
// sentence에는 "Hello World"가 들어가게 됨
cin과 getline을 함께 사용하면 생기는 문제
cin 다음에 getline을 사용할 때 발생하는 문제는 주로 개행 문자(‘\n’) 때문이다.
cin으로 데이터를 읽을 때 사용자가 엔터 키를 누르면 개행 문자가 입력 버퍼에 남아 있게 되는데, 이 개행 문자가 getline에 영향을 주게된다.
std::string number;
std::string name;
std::cout << "Enter a number: ";
std::cin >> number; // 엔터로 입력 종료 후, '\n'가 입력 버퍼에 남아있음
std::cout << "Enter your name: "; // 남아있는 '\n' 때문에 변수에 값을 입력받기 전에 입력 종료
std::getline(std::cin, name);
std::cout << "Number: " << number << std::endl;
std::cout << "Name: " << name << std::endl;
개행 문자가 입력 버퍼에 남아있음
이런 경우, cin.ignore() 함수를 사용하여 ‘\n’를 무시한다.
// 남은 개행 문자를 무시
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
cin.ignore() 함수를 사용하여 개행 문자를 무시
댓글남기기