๐atoi
โ๏ธ ํจ์ ํ๋กํ ํ์
int atoi(const char *str);
โ๏ธ ํจ์์ ์ญํ : str์ intํ์ผ๋ก ๋ฐํํ๋ค.
โ๏ธํจ์ ๋ฐํ๊ฐ
โ๏ธ ๋ฌธ์์ด์ ์ ์๋ก ๋ฐ๊พธ์ด ๋ฆฌํด
๐์ถ๊ฐ ์ค๋ช ๐
โฟ๋งจ ์์ ๊ณต๋ฐฑ๋ฌธ์๋ ์คํตํจ, ๋ถํธ๋ ํ๋๋ง ์์ด์ผํจ. ์ค๊ฐ์ '0' ~ '9' ์ธ์ ๋ฌธ์๊ฐ ์์ผ๋ฉด ๋ฉ์ถค.
โฟatoi์ ๋ฐํ๊ฐ์ (int)strtol(str, (char **)NULL, 10); ์ ๊ฐ๋ค.
--> long ๋ฒ์์์ intํ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๊ฒฝ์ฐ, ์ค๋ฒํ๋ก๋ ๊ฐ์ ๊ทธ๋๋ก ๋ฆฌํด
--> long ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๊ฒฝ์ฐ, ์์์ผ ๋ 0 ์์์ผ ๋ -1์ ๋ฆฌํดํจ.
(โ๏ธ๋งฅ์์๋ long๋ฒ์์ longlong์ ๋ฒ์๊ฐ ๊ฐ๋ค.)
โ๏ธ๊ตฌํ
#include "libft.h"
#include <limits.h>
static unsigned long atolong(const char *str, int *neg, int *len)
{
unsigned long num;
num = 0;
while ((9 <= *str && *str <= 13) || *str == ' ')
str++;
if (*str == '+' || *str == '-')
{
if (*str == '-')
*neg = -1;
str++;
}
while (*str != 0 && '0' <= *str && *str <= '9')
{
num = num * 10 + (*str - '0');
str++;
(*len)++;
}
return (num);
}
int ft_atoi(const char *str)
{
int len;
int neg;
unsigned long longnum;
len = 0;
neg = 1;
longnum = atolong(str, &neg, &len);
if (longnum > LLONG_MAX + 1ULL && neg == -1)
return ((int)LONG_MIN);
else if (longnum > LLONG_MAX && neg == 1)
return ((int)LONG_MAX);
//๊ธธ์ด๊ฐ 19๋ฅผ ๋์ด๊ฐ๋ฉด ์ ๋ถ -1 ํน์ 0์ ๋ฆฌํดํด longlong
//๋ฒ์๋ฅผ ๋ฒ์ด๋ ๊ฒฝ์ฐ๋ ์ฒ๋ฆฌํด์ค๋ค
if (len > 19)
{
if (neg == -1)
return ((int)LONG_MIN);
return ((int)LONG_MAX);
}
return ((int)(longnum * neg));
}
'๐ฐ42์์ธ > libft' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[libft] ft_memcpy, ft_memmove ๊ตฌํ (0) | 2022.02.16 |
---|---|
[libft] ft_memset, ft_bzero, ft_memchr ๊ตฌํ (0) | 2022.02.15 |
[libft] ft_strncmp, ft_memcmp ๊ตฌํ (0) | 2022.02.14 |
[42์์ธ] libft ์ ๋ฆฌ : ft_strchr, ft_strrchr๊ตฌํ (0) | 2022.02.13 |
[42์์ธ] libft ์ ๋ฆฌ : ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค๊ธฐ ์ํ Makefile (0) | 2022.02.11 |