C++

[C++] 사용자 입력 받기

제에엔 2025. 2. 5. 02:18

C++에서 사용자 입력을 받는 방법은 여러 가지가 있다.

 

1️⃣ 기본적인 입력 (`std::cin`)

가장 일반적인 방법은 `std::in`을 사용하는 것이다.

이 경우, 공백 이전까지 입력을 받을 수 있다.

#include <iostream>

int main() {
    int num;
    std::cout << "숫자를 입력하세요: ";
    std::cin >> num;  // 사용자로부터 입력받기
    std::cout << "입력한 숫자는: " << num << " 입니다.\n";
    return 0;
}

 

📌 특징

  • 공백(` `), 개행(`\n`)을 기준으로 입력이 종료된다.
  • 정수(`int`), 실수(`double`), 문자(`char`) 등을 받을 수 있다.

🔴 주의할 점

  • 잘못된 입력(문자 입력 시 오류 발생)

 

2️⃣ 한 줄 입력 (`std::getline`)

문자열 한 줄을 입력 받는 경우에는 `std::getline`을 사용할 수 있다.

#include <iostream>
#include <string>

int main() {
    std::string name;
    std::cout << "이름을 입력하세요: ";
    std::getline(std::cin, name);  // 공백 포함 문자열 입력
    std::cout << "입력한 이름: " << name << "\n";
    return 0;
}

 

📌 특징

  • 공백 포함 입력 가능
  • 한 줄(\n)이 입력될 때까지 받음
  • 숫자 입력(`std::cin`) 후 `std::getline()`을 사용하면 입력 버퍼 문제가 발생할 수 있음

🔴 버퍼 문제 해결 방법

std::cin.ignore();  // 또는 std::cin.ignore(100, '\n');

반드시 숫자 입력(`std::cin`) 후 입력 버퍼에 남아있는 `\n`을 삭제해줘야 한다.

 

3️⃣ 여러 개 입력 받기

`std::cin` 을 통해서 여러 개를 동시에 입력 받을 수 있다.

#include <iostream>

int main() {
    int a, b;
    std::cout << "두 개의 숫자를 입력하세요: ";
    std::cin >> a >> b;  // 공백이나 개행을 기준으로 입력받음
    std::cout << "입력한 숫자: " << a << ", " << b << "\n";
    return 0;
}

 

📌 특징

  • 공백 또는 개행을 기준으로 값을 구분함
  • 숫자가 아닌 값을 입력하면 오류 발생 가능 (`std::cin.fail()`로 처리 가능)

 

4️⃣ 문자 입력 (`std::cin` vs `std::getchar()`)

✅ std::cin을 이용한 문자 입력

#include <iostream>

int main() {
    char ch;
    std::cout << "문자를 입력하세요: ";
    std::cin >> ch;
    std::cout << "입력한 문자: " << ch << std::endl;
    return 0;
}

 

📌 특징

  • 한 글자 입력 가능
  • 공백 문자 입력 시 무시됨
  • 입력 버퍼 문제 발생 가능

✅ std::getchar()을 이용한 문자 입력

#include <iostream>

int main() {
    char ch;
    std::cout << "문자를 입력하세요: ";
    ch = std::getchar();
    std::cout << "입력한 문자: " << ch << std::endl;
    return 0;
}

 

📌 특징

  • 한 문자 입력 가능
  • 공백 포함 가능
  • std::cin과 달리 개행(\n)도 입력받음

 

📌 입력 검증 (`std::cin.fail()`)

사용자로부터 입력을 받을 때, 올바른 값이 들어왔는지 확인하는 과정이 입력 검증(input validation) 이다.

C++에서 std::cin을 사용할 때 잘못된 입력이 들어오면 입력 스트림에 오류 상태가 설정되고, 이후의 입력 처리가 비정상적으로 동작할 수 있다. 이를 방지하기 위해 입력 오류를 감지하고 복구하는 과정이 필요하다.

 

입력이 올바르지 않을 경우에 예외 처리하는 방법은 다음과 같다.

 

기본적인 숫자 입력 검증

숫자만 입력받도록 하고, 잘못된 입력이 들어오면 다시 입력받도록 한다.

#include <iostream>

int main() {
    int num;
    std::cout << "숫자를 입력하세요: ";
    while (!(std::cin >> num)) {  // 숫자가 아닐 경우 반복
        std::cin.clear();  // 오류 플래그 초기화
        std::cin.ignore(100, '\n');  // 잘못된 입력 제거
        std::cout << "올바른 숫자를 입력하세요: ";
    }
    std::cout << "입력한 숫자: " << num << "\n";
    return 0;
}

 

  • `std::cin >> num;`
    • 사용자가 숫자가 아닌 값을 입력하면 `std::cin`이 실패 상태(fail state) 가 되어 이후 입력이 차단됨.
  • `std::cin.clear();`
    • fail state를 초기화해서 다시 입력을 받을 수 있도록 함.
  • `std::cin.ignore(100, '\n');`
    • 입력 버퍼에 남아 있는 잘못된 데이터를 삭제하여 새로운 입력을 받을 준비를 함.
    • 100은 삭제할 최대 문자 수 (충분히 큰 값으로 설정)
    • '\n'은 개행 문자까지 무시함.

특정 범위의 숫자 입력 검증

입력값이 특정 범위 내에 있도록 검증하는 방법이다.

#include <iostream>

int main() {
    int age;
    
    std::cout << "나이를 입력하세요 (0 ~ 120): ";
    
    while (!(std::cin >> age) || age < 0 || age > 120) {  
        std::cin.clear();            
        std::cin.ignore(100, '\n');  
        std::cout << "올바른 나이를 입력하세요 (0 ~ 120): ";
    }
    
    std::cout << "입력한 나이: " << age << "\n";
    return 0;
}

 

 

  • `!(std::cin >> age)` : 숫자가 아닐 경우 오류 처리
  • `age < 0 || age > 120` : 허용된 범위를 벗어나면 오류 처리

공백을 포함한 문자열 입력 검증

이름과 같은 문자열 입력에서 공백을 포함한 전체 줄을 받으려면 위에서 말했듯 `std::getline()`을 사용해야 한다.

#include <iostream>
#include <string>

int main() {
    std::string name;
    
    std::cout << "이름을 입력하세요: ";
    std::getline(std::cin, name);  // 전체 줄 입력 받기
    
    while (name.empty()) {  // 빈 문자열 검증
        std::cout << "이름을 다시 입력하세요: ";
        std::getline(std::cin, name);
    }

    std::cout << "입력한 이름: " << name << "\n";
    return 0;
}

 

 

  • `std::getline(std::cin, name);` : 공백을 포함한 전체 줄을 입력받음
  • `name.empty()`입력이 비어있는지 검사

특정 문자(y/n) 입력 검증

사용자가 한 글자만 입력하도록 제한하는 방법이다.

#include <iostream>

int main() {
    char option;
    
    std::cout << "옵션을 선택하세요 (y/n): ";
    
    while (!(std::cin >> option) || (option != 'y' && option != 'n')) {
        std::cin.clear();
        std::cin.ignore(100, '\n');
        std::cout << "올바른 옵션을 입력하세요 (y/n): ";
    }

    std::cout << "선택한 옵션: " << option << "\n";
    return 0;
}

 

 

  • `!(std::cin >> option)` : 입력이 한 글자가 아니면 오류
  • `(option != 'y' && option != 'n')` : y 또는 n이 아니면 오류

5. 숫자가 아닌 문자가 포함된 경우 검증

사용자가 숫자를 입력할 때, 입력 값에 문자가 포함되지 않았는지 확인하는 방법이다.

#include <iostream>
#include <string>
#include <cctype>

bool isNumber(const std::string &str) {
    for (char ch : str) {
        if (!std::isdigit(ch)) return false;
    }
    return !str.empty();
}

int main() {
    std::string input;
    
    std::cout << "숫자를 입력하세요: ";
    
    while (true) {
        std::getline(std::cin, input);
        if (isNumber(input)) break;  // 숫자이면 탈출
        std::cout << "올바른 숫자를 입력하세요: ";
    }

    int num = std::stoi(input);  // 문자열을 정수로 변환
    std::cout << "입력한 숫자: " << num << "\n";
    return 0;
}

 

 

  • `isNumber()` 함수 : 입력이 숫자인지 확인
  • `std::getline(std::cin, input);` : 전체 줄을 읽어온 후 검증

 

'C++' 카테고리의 다른 글

[C++] 배열(Array) 선언 및 초기화  (0) 2025.02.05