Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C/C++에서 문자열이 정수(int)인지 확인하는 방법

C/C++ 프로그래밍에서 입력받은 문자열이 숫자(정수)로만 구성되어 있는지 확인해야 하는 경우가 자주 발생합니다. 예를 들어 사용자 입력의 유효성을 검사하거나, 파일에서 읽어온 데이터를 처리할 때 이러한 확인 작업이 필요합니다.

가장 대표적인 방법은 표준 라이브러리의 isdigit() 함수를 활용하는 것입니다. 이 함수는 전달된 문자가 숫자('0'~'9')에 해당하는지 판별하여 참 또는 거짓을 반환합니다.

isdigit()을 사용한 기본 예제

다음은 C++에서 문자열이 정수인지 확인하는 예제 코드입니다.

#include<iostream>
#include<string.h>

using namespace std;
int main() {
    char str[] = "3257fg";

    for (int i = 0; i < strlen(str); i++) {
        if(isdigit(str[i]))
            cout<<"The string contains int\n";
        else
            cout<<"The string does not contain int\n";
    }
    return 0;
}

실행 결과

The string contains int
The string contains int
The string contains int
The string contains int
The string does not contain int
The string does not contain int

코드 동작 원리

위 프로그램의 핵심 로직은 main() 함수 안에 있습니다. 반복문을 통해 문자열의 각 문자를 하나씩 순회하면서 내장 함수 isdigit()으로 해당 문자가 숫자인지 검사합니다.

  • 문자가 숫자(0~9)라면 → "문자열에 정수가 포함되어 있습니다"를 출력
  • 문자가 알파벳이나 특수문자라면 → "문자열에 정수가 포함되어 있지 않습니다"를 출력

예제의 문자열 "3257fg"는 앞의 4글자는 숫자이고 마지막 두 글자 'f', 'g'는 알파벳이므로 위와 같은 결과가 출력됩니다.

문자열 전체가 정수인지 확인하는 개선된 방법

위 예제는 문자 단위로만 판별하기 때문에, 문자열 전체가 정수인지 확인하려면 모든 문자가 숫자일 때만 참이 되도록 로직을 수정해야 합니다. 다음과 같이 플래그 변수를 활용할 수 있습니다.

#include<iostream>
#include<string.h>

using namespace std;

bool isInteger(const char* str) {
    if (str == NULL || strlen(str) == 0)
        return false;

    for (int i = 0; i < strlen(str); i++) {
        if (!isdigit(str[i]))
            return false;
    }
    return true;
}

int main() {
    char str[] = "3257fg";

    if (isInteger(str))
        cout<<"문자열은 정수입니다."<<endl;
    else
        cout<<"문자열은 정수가 아닙니다."<<endl;

    return 0;
}

이 코드는 하나라도 숫자가 아닌 문자가 발견되면 즉시 false를 반환하므로, 문자열 전체가 숫자로만 이루어져 있는지 정확하게 판별할 수 있습니다.

참고: strtol()을 이용한 변환 기반 검증

숫자 여부 확인과 동시에 실제 정수 값으로 변환이 필요하다면 strtol() 함수를 사용하는 것이 더 안전하고 효율적입니다. 이 함수는 변환된 끝 위치를 알려주므로, 남은 문자가 있는지 검사하여 유효성을 확인할 수 있습니다.

#include<iostream>
#include<cstdlib>

using namespace std;

bool isInteger(const char* str) {
    char* end;
    long value = strtol(str, &end, 10);
    return (*str != '\0' && *end == '\0');
}

상황에 따라 적절한 방법을 선택하면 되며, 단순한 형식 검사에는 isdigit(), 실제 변환이 필요한 경우에는 strtol()을 사용하는 것이 좋습니다.