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 |
---|