본문 바로가기
Language/C언어

C038_atoi 함수 구현해서 사용하기

by OdOp 관리자 2023. 12. 4.
SMALL

atoi는 문자열을 입력받아 이를 정수형으로 변환해 주는 함수를 말합니다. 

 

만약에 문자열에 공백들이 있으면 이를 제거해 주어야 합니다.

부호가 여러개가 있으면 '-'가 홀수이면 음수로 짝수이면 양수로 부호를 정해 주어야 합니다. 

저희는 위의 역할을 해주는 함수를 OdOp_sign이라 정하겠습니다. 

 

OdOp_sign

char    *OdOp_sign(char *str, int *sign)
{
    while (*str == 32 || (*str >= 9 && *str <= 13))
        str++;
    while (1)
    {
        if (*str == '-')
            *sign *= -1;
        else if (*str != '+')
            return (str);
        str++;
    }
}

ASCII코드로 32는 ' ', 9부터 13까지는 tab을 뜻합니다. 

(더 자세한 정보는 여기서... https://hig0617.tistory.com/5)

메모리 연산으로 공백을 다 제거해 줍니다.

 

그리고 부호를 정하도록 하겠습니다. 

'-'가 나올 때마다 부호를 음수로 바꾸어 주었습니다. 

'+'가 아닌 다른 것이 나오면 현재의 메모리 주소를 return 해주어야 합니다. 

(예를 들어 숫자나 문자 혹은 공백이 되겠죠.)

 

str이 '  ---++45623df'라면 sign은 '-1'이고, str은 '45623df'입니다. 

이제 위의 조합을 사용하여 숫자 '-45623'을 만들 것입니다. 

저희는 숫자를 만들어 주는 함수를 OdOp_number이라고 정하겠습니다. 

 

OdOp_number

int    OdOp_number(char *str, int sign)
{
    int    answer;

    answer = 0;
    while (*str >= '0' && *str <= '9')
    {
        answer *= 10;
        answer += *str - 48;
        str++;
    }
    return (answer * sign);
}

여기서 str은 '45623df'이고 sign은 '-1'입니다. 

4를 읽고 5, 6, 2, 3, d, f순으로 읽게 됩니다. 그렇기 때문에 한 번 읽을 때마다 10을 곱해줍니다. 

4 -> 4 x 10 + 5 -> 45 x 10 + 6 -> 456 x 10 + 2 -> 4562 x 10 + 3 이렇게 진행을 합니다. 

그리고 마지막에 sign을 곱해 출력값을 줍니다. 

 

이제 OdOp_sign과 OdOp_number을 합치는 함수 OdOp_atoi를 만들어 보겠습니다. 

 

OdOp_atoi

int    OdOp_atoi(char *str)
{
    int    sign;

    sign = 1;
    str = OdOp_sign(str, &sign);
    return (OdOp_number(str, sign));
}

쉽게 이해하실 수 있으실 것이라고 생각이 됩니다. 

sign의 초기값을 1이라고 설정해 주고 OdOp_sign에서 sign과 str을 적절한 형태로 바꾸어 줍니다. OdOp_number에서 정수형으로 잘 바꾸어서 출력해 줍니다. 

 

예시를 한 번 보도록 하겠습니다. 

#include <stdio.h>

char    *OdOp_sign(char *str, int *sign)
{
    while (*str == 32 || (*str >= 9 && *str <= 13))
        str++;
    while (1)
    {
        if (*str == '-')
            *sign *= -1;
        else if (*str != '+')
            return (str);
        str++;
    }
}

int    OdOp_number(char *str, int sign)
{
    int    answer;

    answer = 0;
    while (*str >= '0' && *str <= '9')
    {
        answer *= 10;
        answer += *str - 48;
        str++;
    }
    return (answer * sign);
}

int    OdOp_atoi(char *str)
{
    int    sign;

    sign = 1;
    str = OdOp_sign(str, &sign);
    return (OdOp_number(str, sign));
}

int main(void)
{
    char s1[15] = "  ---++45623df";

    printf("%d\n", OdOp_atoi(s1));  //-45623
    return 0;
}

 

LIST