[C++ Keywords] getline() & cin

­woongineer·2024년 10월 4일

C++ Supplement

목록 보기
1/3

1. getline() 함수

getline() 함수는 한 줄 전체의 입력을 읽어들이는 함수다. 즉, 문자열(string)을 입력 받을 때, 공백을 포함한 한 줄 전체를 처리할 수 있다.

std::getline(std::cin, 변수);
  • std::cin으로부터 입력을 받아서 변수에 저장한다.
  • 공백, 탭, 띄어쓰기도 하나의 입력으로 처리한다.

Example

#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;
}
  • 입력: John Doe
  • 출력: Hello, John Doe!

1-1. getline()의 특징:

  • 한 줄 전체를 읽어들이며, 공백이나 탭 같은 구분 문자를 포함해 입력받는다.
  • 사용자가 엔터 키를 누를 때까지 입력을 받는다.
  • 주로 문장 전체공백을 포함한 긴 문자열을 입력받을 때 사용된다.

2. cin 연산자

cin은 공백이나 을 기준으로 입력을 나누며, 하나의 단어 또는 하나의 값만을 입력받는다. 기본적으로 공백이나 개행 문자를 입력 구분자로 처리한다.

std::cin >> 변수;
  • 공백이나 탭, 개행 문자를 만나면 입력을 멈추고 그 전까지의 값을 변수에 저장한다.

Example

#include <iostream>

int main() {
    std::string name;
    std::cout << "Enter your name: ";
    std::cin >> name;
    std::cout << "Hello, " << name << "!" << std::endl;
    return 0;
}
  • 입력: John Doe
  • 출력: Hello, John! (이때 cin은 공백을 기준으로 John만 읽어들임)

2-1. cin의 특징:

  • 공백이나 탭을 만나면 입력을 중단한다.
  • 주로 단일 단어나 숫자 입력 같은 공백이 없는 데이터를 처리하는 데 적합하다.

3. getline()과 cin의 차이점 요약

기능getline()cin
입력 방식한 줄 전체 입력 처리 (공백 포함)공백이나 개행 문자를 만나면 입력 종료
공백 처리공백을 포함한 전체 문자열을 입력받음공백을 만나면 입력을 중단하고 앞부분만 읽음
사용 상황긴 문자열, 문장 입력 시 적합단일 단어, 숫자 입력 시 적합
입력 종료사용자가 Enter를 입력할 때까지 계속 받음공백, 탭, 개행 문자를 만나면 멈춤
주요 용도전체 문장이나 이름(공백 포함) 같은 입력 처리단어, 숫자, 간단한 데이터 입력 처리

4. 두 가지를 함께 사용할 때 주의점

cin과 getline()을 함께 사용할 때 문제가 발생할 수 있다. cin은 개행 문자(Enter)를 버퍼에 남겨두고 다음 입력으로 넘어가기 때문에, getline()을 사용할 때 빈 입력이 들어가는 문제가 생길 수 있다.

Example (문제 상황)

#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()이 빈 줄을 읽어버리는 문제가 생긴다.

해결 방법:

  • cin.ignore()를 사용하여 버퍼에 남은 개행 문자를 무시하도록 처리할 수 있다.
#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()이 정상적으로 입력을 처리할 수 있다.


5. 정리

  • cin은 단일 단어 또는 공백이 없는 데이터를 입력받을 때 적합하며, 공백을 기준으로 입력을 나눈다.
  • getline()은 공백을 포함한 전체 문자열을 읽어들이므로, 여러 단어로 이루어진 문장이나 긴 문자열을 입력받을 때 적합하다.
  • cin과 getline()을 함께 사용할 때는 cin.ignore()를 사용하여 입력 버퍼를 정리하는 것이 중요하다.
profile
통린이 대학원생

0개의 댓글