getline() 함수는 한 줄 전체의 입력을 읽어들이는 함수다. 즉, 문자열(string)을 입력 받을 때, 공백을 포함한 한 줄 전체를 처리할 수 있다.
std::getline(std::cin, 변수);
#include <iostream>
#include <string>
int main() {
std::string name;
std::cout << "Enter your full name: ";
std::getline(std::cin, name);
std::cout << "Hello, " << name << "!" << std::endl;
return 0;
}
cin은 공백이나 탭을 기준으로 입력을 나누며, 하나의 단어 또는 하나의 값만을 입력받는다. 기본적으로 공백이나 개행 문자를 입력 구분자로 처리한다.
std::cin >> 변수;
#include <iostream>
int main() {
std::string name;
std::cout << "Enter your name: ";
std::cin >> name;
std::cout << "Hello, " << name << "!" << std::endl;
return 0;
}
| 기능 | getline() | cin |
|---|---|---|
| 입력 방식 | 한 줄 전체 입력 처리 (공백 포함) | 공백이나 개행 문자를 만나면 입력 종료 |
| 공백 처리 | 공백을 포함한 전체 문자열을 입력받음 | 공백을 만나면 입력을 중단하고 앞부분만 읽음 |
| 사용 상황 | 긴 문자열, 문장 입력 시 적합 | 단일 단어, 숫자 입력 시 적합 |
| 입력 종료 | 사용자가 Enter를 입력할 때까지 계속 받음 | 공백, 탭, 개행 문자를 만나면 멈춤 |
| 주요 용도 | 전체 문장이나 이름(공백 포함) 같은 입력 처리 | 단어, 숫자, 간단한 데이터 입력 처리 |
cin과 getline()을 함께 사용할 때 문제가 발생할 수 있다. cin은 개행 문자(Enter)를 버퍼에 남겨두고 다음 입력으로 넘어가기 때문에, getline()을 사용할 때 빈 입력이 들어가는 문제가 생길 수 있다.
#include <iostream>
#include <string>
int main() {
int age;
std::string name;
std::cout << "Enter your age: ";
std::cin >> age; // 숫자 입력, 개행 문자 버퍼에 남음
std::cout << "Enter your full name: ";
std::getline(std::cin, name); // 버퍼에 남은 개행 문자 때문에 실행되지 않음
std::cout << "Age: " << age << ", Name: " << name << std::endl;
return 0;
}
위 코드에서는 cin >> age에서 숫자를 입력하고 Enter를 누르면, Enter가 남아서 getline()이 빈 줄을 읽어버리는 문제가 생긴다.
해결 방법:
#include <iostream>
#include <string>
int main() {
int age;
std::string name;
std::cout << "Enter your age: ";
std::cin >> age;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 버퍼 정리
std::cout << "Enter your full name: ";
std::getline(std::cin, name);
std::cout << "Age: " << age << ", Name: " << name << std::endl;
return 0;
}
이렇게 하면 cin으로 입력받은 후에 남은 개행 문자를 제거해 getline()이 정상적으로 입력을 처리할 수 있다.