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

C 언어로 사용자 정의 atoi() 함수 구현하는 방법

atoi()는 숫자로 이루어진 문자열(numeric string)을 해당하는 정수 값으로 변환하는 표준 라이브러리 함수입니다. stdlib.h 헤더 파일에 선언되어 있으며, C 프로그래밍에서 문자열과 정수 간의 변환이 필요할 때 자주 사용됩니다.

atoi() 함수의 기본 동작

atoi()는 숫자 문자열만 정수 값으로 변환할 수 있으므로, 입력받은 문자열이 유효한 숫자 형식인지 확인하는 것이 중요합니다.

변환 도중에 문자열에서 숫자가 아닌 문자를 만나면, 그 지점에서 문자열→정수 변환이 즉시 중단됩니다. 이 경우 앞부분의 숫자들만 변환되며, 문자열이 숫자로 시작하지 않는다면 0이 반환됩니다.

표준 atoi() 함수 사용 예제

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

int main(){
    int value;
    char string1[] = "3567";

    value = atoi(string1);
    printf("String value = %s\n", string1);
    printf("Integer value = %d\n", value);

    char string2[] = "TutorialsPoint";
    value = atoi(string2);
    printf("String value = %s\n", string2);
    printf("Integer value = %d\n", value);

    return (0);
}

출력 결과

String value = 3567
Integer value = 3567
String value = TutorialsPoint
Integer value = 0

위 실행 결과를 보면, 숫자로만 구성된 문자열 "3567"은 정수 3567로 성공적으로 변환됩니다. 반면 알파벳으로 시작하는 "TutorialsPoint"는 유효한 숫자가 없기 때문에 0이 반환됩니다.

사용자 정의 atoi() 함수 직접 구현하기

atoi()의 내부 동작 원리를 이해하기 위해 직접 구현해 볼 수 있습니다. 기본적인 구현 로직은 다음과 같습니다.

  1. 문자열 앞부분의 공백 문자를 건너뜁니다.
  2. '+' 또는 '-' 부호가 있는지 확인하고 처리합니다.
  3. 각 자릿수를 읽으면서 result = result * 10 + (문자 - '0') 방식으로 값을 누적 계산합니다.
  4. 숫자가 아닌 문자를 만나면 변환을 종료하고 결과를 반환합니다.
#include <stdio.h>

int myAtoi(const char *str) {
    int result = 0;
    int sign = 1;
    int i = 0;

    /* 공백 문자 건너뛰기 */
    while (str[i] == ' ') {
        i++;
    }

    /* 부호 처리 */
    if (str[i] == '-' || str[i] == '+') {
        if (str[i] == '-')
            sign = -1;
        i++;
    }

    /* 숫자 문자를 정수로 변환 */
    while (str[i] >= '0' && str[i] <= '9') {
        result = result * 10 + (str[i] - '0');
        i++;
    }

    return sign * result;
}

int main(){
    printf("%d\n", myAtoi("3567"));           // 출력: 3567
    printf("%d\n", myAtoi("-1234"));          // 출력: -1234
    printf("%d\n", myAtoi("12abc34"));        // 출력: 12
    printf("%d\n", myAtoi("TutorialsPoint")); // 출력: 0
    return 0;
}

마무리

사용자 정의 atoi() 함수를 직접 구현해 보면 문자열 파싱, 아스키(ASCII) 코드 연산, 예외 상황 처리 등 C 언어의 핵심 개념을 깊이 있게 학습할 수 있습니다. 다만 실무 환경에서는 정수 오버플로우 처리 등 추가적인 안전장치가 포함된 표준 라이브러리 함수를 사용하는 것이 바람직합니다.