42서울
[libft] ft_atoi
seoyepar
2022. 2. 18. 22:47
안녕하세요!!
오늘은 조금 말썽부리는 함수 친구를 데려왔습니다:)
1. ft_atoi
🍀 문자열을 정수로 변환하는 함수
📌 함수원형 (man atoi 기준)
int atoi(const char* nptr)
✏️ 받아온 인자를 정수로 변환하여 return
✏️ 맨 앞의 공백문자들은 무시
✏️ 부호기호는 한 개만 있어야 인정!
✏️ '0~9' 사이의 문자가 아닌 경우 중단!
✏️ 만일 long long형의 범위를 넘는 경우 별도의 예외처리❗
✔ 음수일 때 넘은 경우
▪ return (0);
✔ 양수일 때 넘은 경우
▪ return (-1);
✔ int형의 범위를 넘은 경우
▪ 그냥 overflow 상태 return
🐣 long long형은 int형 연산할 때 초과되는 범위를 다루는 경우 자주 사용!~!
✅ 코드 구현
#include "libft.h"
static long long ft_over(long long flag, long long tmp, long long num);
int ft_atoi(const char *str)
{
size_t i;
long long num;
int flag;
long long tmp;
i = 0;
num = 0;
flag = 1;
while (str[i] == ' ' || (str[i] >= 9 && str[i] <= 13))
i++;
if (str[i] == '-')
flag = -1;
if (str[i] == '-' || str[i] == '+')
i++;
while (str[i] >= '0' && str[i] <= '9')
{
tmp = num;
num = num * 10;
num += str[i++] - '0';
num = ft_over(flag, tmp, num);
if ((tmp > 0) && (num <= 0))
break ;
}
return (num * flag);
}
static long long ft_over(long long flag, long long tmp, long long num)
{
if ((flag == -1) && (tmp > num)) // tmp > num인 경우는 오버플로우인 경우 뿐!
return (0);
else if ((flag != -1) && (tmp > num))
return (-1);
else
return (num);
}