열렬히.뛰기

ft_atoi

école 42 > libft > ft_atoi

개요

  • 문자열 → 숫자
  • 기존의 atoi와 다르게, 부호는 무조건 1개만 있다고 가정한다.

주의할 점 & 구현

  • while(공백 통과) → if(부호 잡기) → while(숫자 계산) 구조
  • 공백 만들기 함수 → static 써서 해당 소스파일 내에서만 사용하게 설계.

필요부분!!

  • atoi ⇒ strtoi를 int로 변환해서 설계했다.
  • strtoi : long 값의 언더플로우/오버플로우를 고려한다.
  • 따라서 제대로 만든 atoi라면 long 최댓값 / 최솟값 고려 필요!
    • limits.h 헤더파일 추가해서 long 최댓값 / 최솟값을 고려해야 한다.

Long_max 확인법

Num > Longmax / 10

  • num 자체가 long_max를 넘는지 알 수 없다.
    • 실제 넘는 경우, 바로 오버플로우가 되어버리기 때문!
  • 10으로 나눠봤을 때를 기준으로 확인한다.

long_min 확인법

(num == Longmax / 10 - 1) && (num % 10 > 7)

  • Long_min은 끝자리가 8. 따라서 8보다 크면 언더플로우.

코드 1 : long 고려하지 않음.

c
#include "libft.h"

static int	is_blank(char c)
{
	if (c >= 9 && c <= 13)
		return (1);
	else if (c == 32)
		return (1);
	else
		return (0);
}

int	ft_atoi(const char *str)
{
	int	sign;
	int	num;

	sign = 1;
	while (*str && is_blank(*str))
		str++;
	if (*str == '+' || *str == '-')
	{
		if (*str == '-')
			sign = -1;
		str++;
	}
	num = 0;
	while (*str != '\0' && (*str >= '0' && *str <= '9'))
	{
		num *= 10;
		num += *str - '0';
		str++;
	}
	return (sign * num);
}

코드 2 : long 범위 처리 코드

c
#include "libft.h"

static int	is_blank(char c)
{
	if (c >= 9 && c <= 13)
		return (1);
	else if (c == 32)
		return (1);
	else
		return (0);
}

int	figure_long(long num)
{
	if (num >= LONG_MAX)
		return ((int)LONG_MAX);
	else
		return ((int)LONG_MIN);
}

int	ft_atoi(const char *str)
{
	int		sign;
	long	num;

	sign = 1;
	while (*str && is_blank(*str))
		str++;
	if (*str == '+' || *str == '-')
	{
		if (*str == '-')
			sign = -1;
		str++;
	}
	num = 0;
	while (*str != '\0' && (*str >= '0' && *str <= '9'))
	{
		if (num >= LONG_MAX / 10 || num <= LONG_MIN)
			return (figure_long(num));
		num *= 10;
		num += *str - '0';
		str++;
	}
	return ((int)(sign * num));
}