๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿฐ42์„œ์šธ/libft

[libft] ft_atoi.c ๊ตฌํ˜„

๐Ÿ“Œ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));
}