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;
}
'Language > C언어' 카테고리의 다른 글
C040_strlen 함수 구현해서 사용하기 (0) | 2023.12.08 |
---|---|
C039_putnbr만들기 (0) | 2023.12.06 |
C037_소수점 아래로 n자리까지 출력하기 (2) | 2023.12.03 |
C036_printf 응용하기기 (2) | 2023.12.02 |
C035_strlcat 함수 구현해서 사용하기 (0) | 2023.10.30 |