개요
- 문자열 → 숫자
- 기존의 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));
}