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

C 언어 itoa 함수 완벽 가이드: 정수를 문자열로 변환하는 방법

C 언어 itoa 함수 완벽 가이드: 정수를 문자열로 변환하는 방법

C 프로그래밍 언어는 탄생한 지 50년이 넘는 시간 동안 전 세계 개발자들에게 꾸준히 사랑받아온 언어입니다. 구조적인 단순함, 강력한 함수 체계, 뛰어난 이식성, 효율적인 메모리 관리 등의 특징 덕분에 다른 언어들과 확실히 차별화됩니다. 특히 C의 함수들은 수많은 개발자가 견고하고 안정적인 코드를 작성하는 데 없어서는 안 될 핵심 자산입니다.

이번 글에서 소개할 itoa는 정수형(int) 데이터를 문자열(string)로 변환해 주는 널리 사용되는 비표준(non-standard) 함수입니다. 그런데 의외로 사용법을 제대로 모르는 분들이 많습니다. 이 가이드에서는 itoa 함수를 어려움 없이 활용하는 방법을 단계별로 자세히 설명하겠습니다.

itoa 함수의 기본 문법

먼저 기본부터 살펴보겠습니다. itoa 함수의 기본적인 사용 형태는 다음과 같습니다.

int main() {
    int num = 12345;
    char str[20];
    itoa(num, str, 10);
    printf("Integer: %d\nString: %s\n", num, str);
    return 0;
}

위 코드에서 각 요소의 역할은 다음과 같습니다.

  1. num: 문자열로 변환할 정수 값
  2. str: 변환 결과가 저장될 문자 배열(버퍼)
  3. 10: 진수(base), 여기서는 10진수를 의미

그럼 실제로 동작하는 완전한 프로그램을 작성하며 itoa 함수를 직접 구현해 보겠습니다. 이번 예제는 사용자가 입력한 정수를 문자열로 변환하는 프로그램입니다.

itoa 함수 직접 구현하기

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

void itoa(int num, char *str, int base) {
    int i = 0;
    int isNegative = 0;

    if (num == 0) {
        str[i++] = '0';
        str[i] = '\0';
        return;
    }

    if (num < 0 && base != 10) {
        isNegative = 1;
        num = -num;
    }

    while (num != 0) {
        int rem = num % base;
        str[i++] = (rem > 9) ? (rem - 10) + 'a' : rem + '0';
        num = num / base;
    }

    if (isNegative && base == 10)
        str[i++] = '-';

    str[i] = '\0';

    int start = 0;
    int end = i - 1;
    while (start < end) {
        char temp = str[start];
        str[start] = str[end];
        str[end] = temp;
        start++;
        end--;
    }
}

int main() {
    int num;
    printf("Enter an integer: ");

    if (scanf("%d", &num) != 1) {
        fprintf(stderr, "Invalid input. Please enter an integer.\n");
        return EXIT_FAILURE;
    }

    int max_size = snprintf(NULL, 0, "%d", num) + 1;
    char *str = (char *)malloc(max_size);

    if (str == NULL) {
        fprintf(stderr, "Memory allocation failed\n");
        return EXIT_FAILURE;
    }

    itoa(num, str, 10);

    printf("Integer: %d\nString: %s\n", num, str);

    free(str);

    return 0;
}

위 프로그램에서 itoa(int num, char *str, int base)가 바로 직접 구현한 itoa 함수입니다. 코드의 핵심 부분을 하나씩 나누어 살펴보겠습니다.

1. 입력값이 0일 때 처리

입력된 숫자가 0이라면 아래 코드가 즉시 결과 문자열에 '0'을 대입하고 함수를 종료합니다.

if (num == 0) {
    str[i++] = '0';
    str[i] = '\0';
    return;
}

2. 음수 처리

입력값이 음수이면서 진수가 10이 아닌 경우, 아래 코드가 음수 플래그를 설정하고 절댓값으로 변환합니다.

if (num < 0 && base != 10) {
    isNegative = 1;
    num = -num;
}

3. 자릿수 변환 루프

다음 반복문은 숫자의 모든 자릿수를 하나씩 추출하여 해당하는 문자로 변환합니다. 특히 진수가 10보다 클 때는 10~15에 해당하는 숫자를 문자 'a'부터 'f'로 표현합니다.

while (num != 0) {
    int rem = num % base;
    str[i++] = (rem > 9) ? (rem - 10) + 'a' : rem + '0';
    num = num / base;
}

4. 음수 기호 추가

원래 숫자가 음수였고 진수가 10이라면, 결과 문자열 끝에 음수 기호('-')를 붙입니다.

if (isNegative && base == 10)
    str[i++] = '-';

5. 문자열 뒤집기

아래 코드는 결과 문자열을 종료한 뒤 순서를 뒤집습니다. 변환 과정에서 자릿수가 역순으로 추출되기 때문에 최종적으로 원래 순서로 되돌려야 하기 때문입니다.

str[i] = '\0';
// Reverse the string
int start = 0;
int end = i - 1;
while (start < end) {
    char temp = str[start];
    str[start] = str[end];
    str[end] = temp;
    start++;
    end--;
}

프로그램 실행 흐름

정리하면, main 함수는 먼저 사용자로부터 정수를 입력받고, 문자열을 담을 메모리를 동적으로 할당합니다. 이후 itoa 함수를 호출해 정수를 문자열로 변환한 뒤 원래 정수와 함께 출력하고, 마지막으로 할당된 메모리를 해제합니다. 예를 들어 프로그램에 숫자를 입력하면 다음과 같은 결과를 확인할 수 있습니다.

C 언어 itoa 함수 완벽 가이드: 정수를 문자열로 변환하는 방법

반면 정수가 아닌 값을 입력하면 프로그램은 다음과 같이 오류 메시지를 출력합니다.

C 언어 itoa 함수 완벽 가이드: 정수를 문자열로 변환하는 방법

마치며

지금까지 C 언어에서 itoa 함수를 구현하고 활용하는 방법을 알아보았습니다. 하나의 예제 안에 여러 기능을 담아 정수를 문자열로 변환하는 과정을 상세히 살펴보았는데요. 물론 이것은 하나의 예시일 뿐입니다. itoa 함수를 다양한 함수와 조합하면 훨씬 더 강력하고 유용한 프로그램을 작성할 수 있습니다.


저자 소개

C 언어 itoa 함수 완벽 가이드: 정수를 문자열로 변환하는 방법

Prateek Jangid

개인적·업무적 이유로 Linux를 열애하는 사용자로, Linux 세계의 새로운 소식을 끊임없이 탐구하고 독자들에게 공유하는 것을 좋아합니다.