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);
}