C++ 프로그래밍을 하다 보면 사용자로부터 입력받은 문자열이 숫자로만 이루어져 있는지 확인해야 하는 경우가 자주 발생합니다. 예를 들어, 입력 검증 단계에서 숫자만 허용해야 하거나, 문자열을 정수로 변환하기 전에 안전성을 확인해야 할 때가 그렇습니다.
여기서 말하는 숫자 문자열(numeric string)이란 모든 문자가 0부터 9 사이의 범위에 속하는 문자열을 의미합니다. 반대로 알파벳이나 특수문자가 하나라도 포함되어 있다면 일반 문자열로 분류됩니다.
기본 원리
해결 방법은 매우 간단합니다. 문자열의 각 문자를 처음부터 끝까지 하나씩 순회하면서 해당 문자가 숫자인지 검사하면 됩니다. 모든 문자가 숫자라면 최종적으로 true를 반환하고, 중간에 숫자가 아닌 문자를 발견하는 즉시 false를 반환하여 불필요한 검사를 줄일 수 있습니다.
C++ 표준 라이브러리에서 제공하는 isdigit() 함수를 활용하면 각 문자가 숫자('0'~'9')인지 손쉽게 판별할 수 있습니다. 이 함수는 <cctype> 헤더에 정의되어 있으며, 인자로 전달된 문자가 숫자이면 0이 아닌 값을, 아니면 0을 반환합니다.
예제 코드
#include <iostream>
using namespace std;
bool isNumeric(string str) {
for (int i = 0; i < str.length(); i++)
if (isdigit(str[i]) == false)
return false; // 숫자가 아닌 문자를 발견하면 false 반환
return true; // 모든 문자가 숫자인 경우 true 반환
}
int main() {
string str;
cout << "문자열을 입력하세요: ";
cin >> str;
if (isNumeric(str))
cout << "숫자입니다" << endl;
else
cout << "숫자가 아닙니다";
}실행 결과
문자열을 입력하세요: 5687 숫자입니다
입력된 "5687"은 모든 문자가 0~9 범위 내에 있으므로 숫자 문자열로 판별됩니다.
실행 결과 (숫자가 아닌 경우)
문자열을 입력하세요: 584asS 숫자가 아닙니다
반면 "584asS"는 'a', 's', 'S'와 같은 알파벳 문자가 포함되어 있어 숫자가 아닌 것으로 판별됩니다.
추가 고려사항
실무에서는 위 기본 구현 외에도 몇 가지 상황을 고려해야 할 수 있습니다.
- 음수 처리: 위 코드는 음수 부호('-')를 숫자로 인식하지 못합니다. 음수도 허용하려면 첫 번째 문자가 '-' 또는 '+'인 경우를 별도로 처리해야 합니다.
- 소수점 처리: 실수(예: "3.14")를 허용하려면 소수점('.') 문자에 대한 예외 처리가 필요합니다.
- 빈 문자열: 빈 문자열이 입력되면 for 루프가 실행되지 않아 true가 반환되므로, 필요에 따라 길이 검사를 추가하는 것이 좋습니다.
이처럼 isdigit() 함수와 간단한 반복문만으로도 문자열이 숫자인지 효율적으로 확인할 수 있습니다.