C 언어에서 문자열과 숫자 변환 방법 | 안전한 구현과 오류 처리

1. 소개: C 언어에서 문자열과 숫자 변환의 중요성

C 언어 프로그래밍에서 문자열과 숫자 변환은 매우 중요한 작업입니다. 특히 사용자 입력이나 외부 파일 데이터 처리 시 문자열을 숫자로 변해야 하는 경우가 자주 발생합니다. 반대로 계산 결과나 로그를 위해 숫자를 문자열로 변환하는 경우도 빈번합니다. 이러한 변환을 수행하려면 몇 가지 방법이 있지만, 어떤 방법을 선택할지는 사용 상황에 따라 신중히 판단해야 합니다. 본 기사에서는 C 언어에서 문자열과 숫자 변환 방법을 자세히 설명하고, 오류 처리 및 안전한 사용 방법에 대해서도 다룹니다.

2. C 언 문자열을 숫자로 변환하는 방법

atoi() 함수에 의한 기본적인 문자열→정수 변환

C 언어에서 문자열을 정수로 변환하는 가장 기본적인 방법은 atoi() 함수를 사용하는 것입니다. 이 함수는 간단히 사용할 수 있지만, 주의점도 있습니다. 아래에 기본적인 사용법을 보여줍니다。
#include <stdio.h>
#include <stdlib.h>

int main() {
    char str[] = "123";
    int num = atoi(str);
    printf("변환 후의 숫자: %dn", num);
    return 0;
}
atoi()는 간단하지만, 오류 검사가 부족합니다. 예를 들어, 잘못된 입력이 있어도 오류를 보고하지 않습니다. 다음 예에서는, 잘못된 문자열에 대한 atoi()의 동작을 보여줍니다。
char str[] = "123abc";
int num = atoi(str);  // ""만 변환되고, 나머지는 무시됩니다
atoi()는 이처럼 잘못된 문자열이 포함되어 있어도, 중간까지 변환에 성공한 부분만 반환하기 때문에, 안전성이 요구되는 시스템에서는 사용을 피 합니다。

strtol() 함수로 안전한 변환

오류 검사가 필요한 경우에는 strtol() 함수를 사용하는 것을 권장합니다. strtol()는 잘못된 입력에 대해 오류 처리를 수행하고, 변환에 실패했을 때나 진수를 지정하여 변환하는 것이 가능합니다. 다음 코드는 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 || *endptr != '�') {
        printf("변환에 실패했습니다.n");
    } else {
        printf("변환 후의 숫자: %ldn", num);
    }

    return 0;
}
이 코드에서는, 잘못된 부분의 문자열을 감지하기 위해 endptr를 사용합니다. 또한, errno를 확인함으로써 오버플로우나 언더플로우와 같은 오류도 감지할 수 있습니다。
侍エンジニア塾

3. C 언어에서 숫자를 문자열로 변환하는 방법

sprintf() 함수와 그 위험

숫자를 문자열로 변환하려면 sprintf() 함수를 사용합니다. sprintf()는 지정된 포맷에 따라 숫자를 문자열로 변환하고 버퍼에 기록합니다. 다만, 버퍼 오버플로우 위험이 있으므로 주의가 필요합니다. 아래에 기본적인 사용 예를 보여드립니다.
#include <stdio.h>

int main() {
    int num = 123;
    char str[10];
    sprintf(str, "%d", num);
    printf("변환 후 문자열: %sn", str);
    return 0;
}
이 코드에서는 정수를 문자열로 변환하고 있지만, 변환 후 문자열이 버퍼 크기를 초과하면 오버플로우가 발생할 위험이 있습니다.

snprintf()를 이용한 안전한 변환

버퍼 오버플로우를 방지하기 위해 snprintf()를 사용하는 것이 권장됩니다. snprintf()는 버퍼 크기를 지정하여 변환을 수행하므로, 지정된 크기를 초과하는 출력은 잘려서 버려집니다. 다음 예를 살펴보겠습니다.
#include <stdio.h>

int main() {
    int num = 12345;
    char str[5];
    snprintf(str, sizeof(str), "%d", num);
    printf("변환 후 문자열: %sn", str);  // 버퍼가 작기 때문에, 결과는 "1234"
    return 0;
}
이 코드에서는 출력이 버퍼 크기를 초과하므로 마지막 문자가 잘려서 버려집니다. snprintf()는 버퍼 크기를 지정함으로써 오버플로우를 방지하는 안전한 방법입니다.

4. 실제 사용 예시: 문자열과 숫자의 양방향 변환

C 언어에서는 양방향으로 문자열과 숫자를 변환하는 것이 자주 수행됩니다. 아래 코드에서는 sscanf()snprintf()를 사용하여 문자열에서 숫자로, 숫자에서 문자열로의 양방향 변환을 구현하고 있습니다.
#include <stdio.h>

int main() {
    char str[] = "12345";
    int num;
    sscanf(str, "%d", &num);
    printf("문자열에서 숫자로 변환: %dn", num);

    char new_str[10];
    snprintf(new_str, sizeof(new_str), "%d", num);
    printf("숫자에서 문자열로 변환: %sn", new_str);

    return 0;
}
이 예에서는 먼저 sscanf()를 사용하여 문자열을 숫자로 변환하고, 그 다음 snprintf()를 사용하여 숫자를 다시 문자열로 변환합니다. 양방향 변환은 입력 데이터를 처리하고 결과를 표시할 때 매우 유용합니다.

5. 오류 처리와 주의점

오버플로와 언더플로 처리

숫자를 문자열로 변환할 때 오버플로나 언더플로가 발생할 수 있습니다. 특히 변환 후의 숫자가 데이터 타입 범위를 초과하면 오류가 발생할 가능성이 있습니다. strtol()sscanf()를 사용할 때는 아래와 같이 오류를 적절히 처리하는 것이 중요합니다.
if (errno == ERANGE) {
    printf("오버플로 또는 언더플로가 발생했습니다. n");
}
errno를 체크함으로써 오류가 발생했는지 여부를 확인할 수 있습니다. 오버플로와 언더플로에 대한 오류 처리를 적절히 수행하면 프로그램이 예기치 않은 동작을 일으키는 것을 방지할 수 있습니다.

잘못된 입력에 대한 대처 방법

문자열이 잘못된 형식인 경우, 숫자로의 변환이 실패합니다. 예를 들어 "123abc"와 같은 문자열을 변환하려고 하면 숫자 부분만 변환되고 그 이후는 무시됩니다. 이를 방지하기 위해 strtol()에서는 변환에 성공한 위치를 나타내는 포인터를 사용하여 오류 검사를 수행합니다.
char *endptr;
long num = strtol(str, &endptr, 10);
if (*endptr != '�') {
    printf("잘못된 입력이 포함되어 있습니다. n");
}

6. 요약

에러 체크를 소홀히 하지 않고, 안전한 방법으로 숫자와 문자열 변환을 수행하는 것이 프로그램의 안정성을 확보하기 위해 중요합니다. atoi()는 간편하게 사용할 수 있지만, 오류가 발생했을 때 처리를 할 수 없으므로 기본적으로 strtol()이나 sscanf()</>, snprintf()와 같은 안전성이 높은 함수를 사용하는 것이 권장됩니다. C 언어에서 문자열과 숫자 변환은 프로그래머에게 기본적인 기술입니다. 이 기술을 습득하면 보다 견고한 프로그램을 만들 수 있게 됩니다. 또한, 오류 처리와 메모리 관리를 철저히 수행함으로써 보안 측면에서도 안심하고 운영할 수 있는 프로그램을 제공할 수 있습니다.

더 배우기 위해

이 주제에 대해 더 깊이 배우고 싶다면, 공식 문서나 오픈소스 프로젝트의 코드를 참고하면 좋습니다. 또한, C 언어의 오류 처리와 메모리 관리에 관한 서적도 많이 출판되어 있으니, 그것들을 활용하는 것을 권장합니다.
侍エンジニア塾