Do You Coding?

[library] itoa ๊ตฌํ˜„ํ•˜๊ธฐ ๋ณธ๋ฌธ

CS & Engineering/C

[library] itoa ๊ตฌํ˜„ํ•˜๊ธฐ

๐Ÿ“Œ ๋งค๋‰ด์–ผ (in subject)

๋”๋ณด๊ธฐ

Function name

     do_itoa

 

Prototype

    char *do_itoa(int n);

 

Parameters

     n: the integer to convert

: n: ๋ณ€ํ™˜ํ•  ์ •์ˆ˜

 

Return value

     The string representing the integer. NULL if the allocation fails.

: ์ •์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด. ํ• ๋‹น์— ์‹คํŒจํ•˜๋ฉด NULL

 

External functs

     malloc

 

Description

     Allocates (with malloc(3)) and returns a string representing the integer received as an argument. Negative numbers must be handled.

: malloc์„ ์‚ฌ์šฉํ•˜์—ฌ ํ• ๋‹นํ•˜๊ณ  ์ธ์ˆ˜๋กœ ๋ฐ›์€ ์ •์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜. ์Œ์ˆ˜ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ.

 

๐Ÿ“Œ ์ž‘์„ฑ ์ฝ”๋“œ

static void	do_negative(int *n, char **str)
{
	if ((*n) < 0 && *n != -2147483648)
	{
		(*str)[0] = '-';
		(*n) = (*n) * (-1);
	}
	if ((*n) == -2147483648)
	{
		(*str)[0] = '-';
		(*str)[1] = '2';
		(*n) = 147483648;
	}
}

static int	do_digit(int n, int *minus)
{
	int	d;

	d = 1;
	if (n == -2147483648)
	{
		*minus = 2;
		d = 9;
		return (d);
	}
	if (n < 0)
	{
		n = n * (-1);
		*minus = 1;
	}
	else
		*minus = 0;
	while (n >= 10)
	{
		n = n / 10;
		d ++;
	}
	return (d);
}

char	*do_itoa(int n)
{
	char	*str;
	int		minus;
	int		i;
	int		digit;
	int		nb;

	i = 1;
	digit = do_digit(n, &minus);
	str = (char *)malloc(sizeof(char) * (digit + minus + 1));
	if (str == NULL)
		return (NULL);
	do_negative(&n, &str);
	while (i <= digit)
	{
		nb = n % 10 + 48;
		n = n / 10;
		str[digit + minus - i] = nb;
		i ++;
	}
	str [digit + minus] = '\0';
	return (str);
}

 

๐Ÿ“Œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ

itoa ํ•จ์ˆ˜๋Š” int to alphabet ์œผ๋กœ, ์ •์ˆ˜๋กœ ๋ฐ›์€ ์ธ์ž๋ฅผ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

์˜ˆ์‹œ๋กœ 12345๋ผ๋Š” ์ •์ˆ˜๋ฅผ ๋ฐ›์œผ๋ฉด, "12345"์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜๋ฐ›๋Š” ๊ฒƒ์ด๋‹ค.

 

> ์˜ˆ์™ธ์ ์œผ๋กœ ๊ณ ๋ คํ•ด์•ผํ•  ์‚ฌํ•ญ

1. ์ตœ์†Ÿ๊ฐ’์ธ -2147483648 ์˜ ์˜ˆ์™ธ ( * (-1) ์„ ํ•˜๋ฉด overflow ๋˜๋ฏ€๋กœ ์ฒ˜๋ฆฌ ํ•„์š”)

2. ์Œ์ˆ˜ ์ฒ˜๋ฆฌ (- ๋ถ€ํ˜ธ ๋ถ™์ด๊ธฐ)

 

์ผ๋‹จ, ์ž๋ฆฟ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

do_digit ํ•จ์ˆ˜๊ฐ€ ์ž๋ฆฟ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ผ๋‹จ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์˜ˆ์™ธ์ ์ธ ์ตœ์†Ÿ๊ฐ’์„ ๋จผ์ € ์ฒ˜๋ฆฌํ•œ๋‹ค.

minus๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด๋Š” ์Œ์ˆ˜์˜ '-' ๋ถ€ํ˜ธ๋ฅผ ๋ถ™ํž ์ž๋ฆฌ๋ฅผ ๋งˆ๋ จํ•˜๊ธฐ ์œ„ํ•œ ์—ญํ• ์œผ๋กœ,

0 ์ด๋ฉด ์–‘์˜ ์ •์ˆ˜ / 1์ด๋ฉด ์ผ๋ฐ˜ ์Œ์˜ ์ •์ˆ˜ / 2์ด๋ฉด ์ตœ์†Ÿ๊ฐ’์ด ๋œ๋‹ค.

 

์ตœ์†Ÿ๊ฐ’์˜ minus ๋ณ€์ˆ˜๊ฐ’์ด 2๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ -2147483648 ์—์„œ, ์•ž์˜ '-2' ๊ณต๊ฐ„์„ ๊ฐ๊ฐ ๋Œ€์ž…ํ•˜๊ณ ,

๋‚˜๋จธ์ง€ '147483648'์„ ๋‹ค๋ฅธ ์ •์ˆ˜์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด -์™€ 2์˜ ๊ณต๊ฐ„์„ ๋งˆ๋ จํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ™œ์šฉํ–ˆ๋‹ค.

 

๊ทธ๋ฆฌํ•˜์—ฌ ์ตœ์†Ÿ๊ฐ’์€ ์ž๋ฆฟ์ˆ˜ d : 9 , minus : 2 ์ธ ์ƒํƒœ๋กœ return ๋  ๊ฒƒ์ด๊ณ ,

๊ทธ ์™ธ์—, ์Œ์ˆ˜์ด๋ฉด -1์„ ๊ณฑํ•ด ์–‘์˜ ์ •์ˆ˜๋กœ ๋งŒ๋“ค๊ณ , minus : 1, ์–‘์ˆ˜์ด๋ฉด minus : 0 ์œผ๋กœ ๋งŒ๋“ค๊ณ  ๋„˜์–ด๊ฐ„๋‹ค.

 

๊ทธ ํ›„์—” 10์”ฉ ๋‚˜๋ˆ ์„œ ์ž๋ฆฟ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ return ํ•˜๊ณ , ๋‹ค์‹œ do_itoa ํ•จ์ˆ˜๋กœ ๋Œ์•„์˜จ๋‹ค.

๊ทธ๋ฆฌํ•˜์—ฌ, ๊ตฌํ•œ digit + minus ์— '\0' ์ž๋ฆฌ๋ฅผ ํ•˜๋‚˜ ๋”ํ•ด ๋™์ ํ• ๋‹นํ•ด์ค€๋‹ค.

 

๋‹ค์Œ์€ do_negative ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

์ด ํ•จ์ˆ˜๋Š” ์Œ์ˆ˜๋Š” ๋ฌธ์ž์—ด์˜ 0๋ฒˆ์งธ๋ฅผ '-'๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ , ์Œ์ˆ˜๋ฅผ ์–‘์ˆ˜๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์„ ์ทจํ•˜๊ณ ,

์ตœ์†Ÿ๊ฐ’์€ ๋ฌธ์ž์—ด 0๋ฒˆ์งธ์— '-', 1๋ฒˆ์งธ์— '2'๋ฅผ ๋„ฃ์€ ๋’ค, ๋‚จ์€ ์ˆซ์ž๋ฅผ '1473648'์ธ ์ฒ˜๋ฆฌ๊ฐ€๋Šฅํ•œ ์ˆซ์ž๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

 

์ดํ›„๋Š” ๋ฐ˜๋ณต๋ฌธ์ด๋‹ค. 

10์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€์— 48(= '0') ์„ ๋”ํ•œ ๊ฐ’์„ nb์— ๋„ฃ์–ด์ฃผ๋Š”๋ฐ, ์ด๋Š” ๊ฐ€์žฅ ๋‚ฎ์€ ์ž๋ฆฟ์ˆ˜์˜ ์ˆซ์ž๋ฅผ ๋ฌธ์žํ™”ํ•œ ๊ฒƒ์ด๋‹ค.

๋‚จ์€ ์ˆซ์ž๋“ค์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ์œ„ํ•ด n์„ 10์œผ๋กœ ๋‚˜๋ˆ ์„œ n์— ๋‹ค์‹œ ์ ์šฉ์‹œ์ผœ์ฃผ๊ณ ,

str[digit + minus - i] ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋’ค์—์„œ๋ถ€ํ„ฐ nb๋กœ ์ฑ„์šด๋‹ค. 

๊ทธ๋Ÿผ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ •์ˆ˜๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พผ str์ด ๋งŒ๋“ค์–ด์ง„๋‹ค.

 

 

 

 

+) ์ตœ์†Ÿ๊ฐ’ ์ฒ˜๋ฆฌ๊ฐ€ ํˆฌ๋ฐ•ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ์ ์ด ์กฐ๊ธˆ ์•„์‰ฌ์šด๋ฐ, ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ๊ณ ๋ฏผํ•ด๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.