c 언어/c 표준 라이브러리(Standard C Library)

C 언어 표준 라이브러리 `string.h` - 문자열을 숫자로 변환하는 함수 `atoi`, `atof`

임베디드 친구 2025. 2. 15. 11:34
728x90
반응형

C 언어에서 문자열을 숫자로 변환할 때 string.hatoiatof 함수를 사용할 수 있습니다.
이번 포스팅에서는 두 함수의 사용법과 주의할 점, 그리고 예제를 살펴보겠습니다.

1. atoi 함수 (문자열을 정수로 변환)

atoi 함수는 string.h에 정의된 함수로, 문자열을 int 타입의 정수로 변환하는 역할을 합니다.

atoi 함수 원형

#include <stdlib.h>
int atoi(const char *str);

atoi 함수 동작 원리

  • 입력 문자열의 앞부분에서 숫자로 변환 가능한 부분을 int로 변환하여 반환합니다.
  • 변환할 수 없는 문자가 나오면 그 이전까지의 숫자만 변환합니다.
  • 변환할 숫자가 없으면 0을 반환합니다.
  • 숫자가 아닌 공백이나 +, - 기호는 허용되며, - 기호가 있을 경우 음수로 변환합니다.
  • atoi는 변환 실패를 감지할 방법이 없으므로, 변환 오류를 확인하려면 strtol을 사용하는 것이 좋습니다.

atoi 사용 예제

#include <stdio.h>
#include <stdlib.h>

int main() {
    char str1[] = "1234";
    char str2[] = "   -567";
    char str3[] = "42abc";
    char str4[] = "hello123";

    int num1 = atoi(str1);
    int num2 = atoi(str2);
    int num3 = atoi(str3);
    int num4 = atoi(str4);

    printf("atoi(\"%s\") = %d\n", str1, num1);
    printf("atoi(\"%s\") = %d\n", str2, num2);
    printf("atoi(\"%s\") = %d\n", str3, num3);
    printf("atoi(\"%s\") = %d\n", str4, num4);

    return 0;
}

실행 결과

atoi("1234") = 1234
atoi("   -567") = -567
atoi("42abc") = 42
atoi("hello123") = 0

atoi 사용 시 주의할 점

  • 변환할 문자열에 숫자가 없으면 0을 반환합니다.
  • atoi("2147483648")과 같이 int 범위를 초과하는 값을 변환하면 오버플로우가 발생할 수 있습니다.
  • 변환 실패를 감지할 방법이 없으므로, 보다 안전한 strtol을 사용하는 것이 좋습니다.

2. atof 함수 (문자열을 실수로 변환)

atof 함수는 string.h가 아닌 stdlib.h에 정의되어 있으며, 문자열을 double 타입의 실수로 변환합니다.

atof 함수 원형

#include <stdlib.h>
double atof(const char *str);

atof 함수 동작 원리

  • atoi와 유사하게, 변환할 수 있는 숫자 부분을 double로 변환하여 반환합니다.
  • 부동소수점 형식(. 소수점 포함)과 지수 표현 (e 또는 E)도 인식합니다.
  • 변환할 숫자가 없으면 0.0을 반환합니다.
  • 변환 오류를 감지할 방법이 없으므로, strtod 함수를 사용하는 것이 더 안전합니다.

atof 사용 예제

#include <stdio.h>
#include <stdlib.h>

int main() {
    char str1[] = "3.14";
    char str2[] = "  -0.00123";
    char str3[] = "2.71e3";
    char str4[] = "hello1.23";

    double num1 = atof(str1);
    double num2 = atof(str2);
    double num3 = atof(str3);
    double num4 = atof(str4);

    printf("atof(\"%s\") = %f\n", str1, num1);
    printf("atof(\"%s\") = %f\n", str2, num2);
    printf("atof(\"%s\") = %f\n", str3, num3);
    printf("atof(\"%s\") = %f\n", str4, num4);

    return 0;
}

실행 결과

atof("3.14") = 3.140000
atof("  -0.00123") = -0.001230
atof("2.71e3") = 2710.000000
atof("hello1.23") = 0.000000

atof 사용 시 주의할 점

  • atoi와 마찬가지로 변환 실패를 감지할 방법이 없으며, strtod를 사용하는 것이 더 안전합니다.
  • 2.71e3과 같은 지수 표현을 올바르게 해석합니다.

3. atoiatof의 한계와 대안

atoiatof의 문제점

  • 변환 오류를 감지할 방법이 없어 예외 처리가 어렵습니다.
  • atoi는 정수 범위를 초과하는 경우 오버플로우가 발생할 수 있습니다.
  • atof는 정확한 오류 검출이 어렵습니다.

더 안전한 대안: strtolstrtod

atoiatof 대신 strtol(정수 변환)과 strtod(실수 변환)를 사용하면 변환 실패를 감지하고 더 정밀한 예외 처리가 가능합니다.

strtol 사용 예제

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main() {
    char str[] = "123abc";
    char *endptr;
    errno = 0;
    long num = strtol(str, &endptr, 10);

    if (errno != 0) {
        perror("strtol");
    } else if (endptr == str) {
        printf("변환할 숫자가 없습니다.\n");
    } else {
        printf("변환된 값: %ld\n", num);
    }

    return 0;
}

4. 결론

  • atoiatof는 간단한 문자열 변환에 유용하지만, 오류 감지가 어려운 단점이 있습니다.
  • 보다 안전한 변환을 위해 strtolstrtod를 사용하는 것이 좋습니다.
  • 문자열을 숫자로 변환할 때 입력값이 유효한지 항상 확인하는 습관을 들이는 것이 중요합니다.

이상으로 atoiatof 함수의 설명과 예제를 마칩니다. 감사합니다!

반응형