C++ getline() 함수란?
C++의 getline() 함수는 스트림에서 문자를 비형식화(unformatted) 입력으로 추출하여, C 스타일 문자열(c-string)인 s에 저장하는 함수입니다. 추출 작업은 구분 문자(delimiter)를 만나거나, 종료 널 문자(null character)를 포함해 최대 n개의 문자가 s에 기록될 때까지 계속 진행됩니다.
공백을 포함한 한 줄 전체를 입력받을 수 있어, cin >> 연산자로는 처리하기 어려운 문장 단위 입력에 유용하게 활용됩니다.
함수 선언
basic_istream& getline (char_type* s, streamsize n); basic_istream& getline (char_type* s, streamsize n, char_type delim);
매개변수 설명
- s: 문자 배열을 가리키는 포인터로, 추출된 문자들이 C 스타일 문자열 형태로 저장됩니다.
- n: 기록할 수 있는 최대 문자 수입니다. 종료 널 문자(
\0)도 이 개수에 포함되므로, 실제 저장 가능한 문자는 n-1개입니다. - delim: 명시적으로 지정하는 구분 문자입니다. 다음에 추출할 문자가 이 구분 문자와 같으면(
traits_type::eq로 비교) 문자 추출이 즉시 중단됩니다. 세 번째 인수를 생략하면 기본값으로 개행 문자('\n')가 사용됩니다.
반환값
이 함수는 basic_istream 객체(*this)를 반환합니다. 덕분에 여러 입력 함수 호출을 연속으로 연결(chaining)하여 사용할 수 있습니다.
사용 예제
#include <iostream>
using namespace std;
int main () {
char name[256], title[256];
cout << "이름을 입력하세요: ";
cin.getline (name, 256);
cout << "가장 좋아하는 영화를 입력하세요: ";
cin.getline (title, 256);
cout << name << "님이 가장 좋아하는 영화는 " << title << " 입니다";
}
실행 결과
이름을 입력하세요: Jack 가장 좋아하는 영화를 입력하세요: The Boss Baby Jack님이 가장 좋아하는 영화는 The Boss Baby 입니다
위 예제에서 볼 수 있듯이, getline()은 공백을 포함한 문장 전체("The Boss Baby")를 하나의 문자열로 그대로 저장합니다. 일반적인 cin >> 연산자라면 첫 번째 공백에서 입력이 잘렸을 것입니다.
cin >> 와 함께 사용할 때 주의점
cin >> 연산자로 값을 입력받은 직후 getline()을 호출하면, 입력 버퍼에 남아 있는 개행 문자('\n')를 구분 문자로 인식해 빈 문자열이 즉시 반환되는 문제가 발생할 수 있습니다. 이 경우 cin.ignore()를 먼저 호출해 버퍼에 남은 개행 문자를 제거한 뒤 사용하는 것이 안전합니다.
std::string과 함께 사용하기
크기가 고정된 char 배열 대신 std::string을 사용하고 싶다면, <string> 헤더에 정의된 자유 함수 형태의 getline(istream, string)을 사용하면 됩니다. 이 방식은 배열 크기 제한 없이 임의 길이의 문자열을 안전하게 입력받을 수 있어 현대 C++에서 더 권장되는 방법입니다.