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

C 언어 `string.h`의 문자열 숫자 변환 함수: `strtol`과 `strtod`

임베디드 친구 2025. 2. 16. 12:08
728x90
반응형

C 언어에서 문자열을 숫자로 변환하는 경우가 많습니다. string.hstdlib.h에서 제공하는 strtolstrtod 함수는 이러한 변환을 효과적으로 수행할 수 있도록 도와줍니다.

이 포스팅에서는 strtol(문자열을 정수로 변환)과 strtod(문자열을 실수로 변환)의 사용법을 예제와 함께 설명하겠습니다.


1. strtol 함수

strtol 개요

strtol 함수는 문자열을 long 정수로 변환하는 함수입니다. 다양한 진법을 지원하며, 변환이 실패할 경우 오류 처리를 할 수 있도록 endptr을 제공합니다.

strtol 함수 원형

#include <stdlib.h>

long strtol(const char *nptr, char **endptr, int base);

매개변수 설명

  • nptr: 변환할 문자열
  • endptr: 변환되지 않은 부분을 가리킬 포인터 (NULL 가능)
  • base: 변환할 진법 (2 ~ 36, 또는 0)
    • base가 0이면 자동으로 진법을 감지 (0x 또는 0X로 시작하면 16진수, 0으로 시작하면 8진수, 그 외에는 10진수로 인식)

strtol 예제

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

int main() {
    char str[] = "1234abcd";
    char *endptr;
    long value;

    value = strtol(str, &endptr, 10);

    printf("변환된 값: %ld\n", value);
    printf("변환되지 않은 부분: %s\n", endptr);

    return 0;
}

실행 결과

변환된 값: 1234
변환되지 않은 부분: abcd

위 코드에서 strtol은 "1234"까지만 변환하고 endptr을 통해 변환되지 않은 "abcd"를 반환합니다.


2. strtod 함수

strtod 개요

strtod 함수는 문자열을 double 형으로 변환하는 함수입니다. strtol과 유사하게 변환 실패 시 변환되지 않은 부분을 endptr로 반환할 수 있습니다.

strtod 함수 원형

#include <stdlib.h>

double strtod(const char *nptr, char **endptr);

매개변수 설명

  • nptr: 변환할 문자열
  • endptr: 변환되지 않은 부분을 가리킬 포인터 (NULL 가능)

strtod 예제

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

int main() {
    char str[] = "3.14159abcd";
    char *endptr;
    double value;

    value = strtod(str, &endptr);

    printf("변환된 값: %f\n", value);
    printf("변환되지 않은 부분: %s\n", endptr);

    return 0;
}

실행 결과

변환된 값: 3.141590
변환되지 않은 부분: abcd

이 예제에서는 strtod가 "3.14159"까지만 변환하고, 나머지 "abcd"는 변환되지 않은 문자열로 남깁니다.


3. strtolstrtod 활용 예제

사용자로부터 입력을 받아 숫자로 변환하고 오류 처리를 수행하는 예제를 작성해보겠습니다.

strtol을 이용한 입력 처리

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

int main() {
    char input[100];
    char *endptr;
    long value;

    printf("정수를 입력하세요: ");
    fgets(input, sizeof(input), stdin);

    errno = 0;  // 에러 상태 초기화
    value = strtol(input, &endptr, 10);

    if (errno == ERANGE) {
        printf("오버플로우 또는 언더플로우 발생!\n");
    } else if (endptr == input) {
        printf("변환할 수 있는 숫자가 없습니다!\n");
    } else {
        printf("변환된 값: %ld\n", value);
    }

    return 0;
}

strtod를 이용한 입력 처리

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

int main() {
    char input[100];
    char *endptr;
    double value;

    printf("실수를 입력하세요: ");
    fgets(input, sizeof(input), stdin);

    errno = 0;
    value = strtod(input, &endptr);

    if (errno == ERANGE) {
        printf("오버플로우 또는 언더플로우 발생!\n");
    } else if (endptr == input) {
        printf("변환할 수 있는 숫자가 없습니다!\n");
    } else {
        printf("변환된 값: %f\n", value);
    }

    return 0;
}

4. 정리

  • strtol은 문자열을 정수(long)로 변환하며, 다양한 진법을 지원함.
  • strtod는 문자열을 실수(double)로 변환함.
  • 두 함수 모두 변환 실패 시 endptr을 통해 오류를 확인할 수 있음.
  • errno를 활용하여 변환 중 오버플로우/언더플로우를 감지할 수 있음.

위 함수를 적절히 활용하면 문자열을 숫자로 변환할 때 오류를 최소화하면서 효율적인 변환을 수행할 수 있습니다. strtolstrtod를 활용하여 더욱 견고한 C 프로그램을 작성해 보세요!

반응형