Do You Coding?

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

CS & Engineering/C

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

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

๋”๋ณด๊ธฐ

NAME

    atoi - convert a string to an integer
: ๋ฌธ์ž์—ด์„ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

SYNOPSIS

    #include <stdlib.h>

    int atoi(const char *nptr);


DESCRIPTION
    The atoi() function converts the initial portion of the string pointed to by nptr to int.

    The behavior is the same as

        strtol(nptr, NULL, 10);
    except that atoi() does not detect errors.
: atoi() ํ•จ์ˆ˜๋Š” nptr๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฌธ์ž์—ด์˜ ์ฒ˜์Œ ๋ถ€๋ถ„์„ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๋™์ž‘ ๋ฐฉ์‹์€ ๋‹ค์Œ ์ฝ”๋“œ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
    strtol(nptr, NULL, 10);
์ฆ‰, strtol() ํ•จ์ˆ˜๋ฅผ base 10(์‹ญ์ง„๋ฒ•)์œผ๋กœ ์‚ฌ์šฉํ•œ ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ atoi()๋Š” ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
(strtol()์€ ๋ณ€ํ™˜ ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, atoi()๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Œ.)

RETURN VALUE

    The converted value or 0 on error.
: ๋ณ€ํ™˜๋œ ์ •์ˆ˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ 0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

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

int	do_atoi(const char *nptr)
{
	long long int	sign;
	long long int	n;
	int	i;
	
	sign = 1;
	n = 0;
	i = 0;
	while (nptr[i] == 32 || (nptr[i] >= 9 && nptr[i] <= 13))
		i ++;
	if (nptr[i] == '+' || nptr[i] == '-')
	{
		if (nptr[i] == '-')
			sign = -1;
		i ++;
	}
	while (nptr[i] >= '0' && nptr[i] <= '9')
	{
		n = 10 * n + (nptr[i] - 48);
		i ++;
	}
	return (sign * n);
}

 

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

shell์—์„œ ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ๋•Œ, ์–ด๋–ค ์ธ์ž๋ฅผ ์ž‘์„ฑํ•ด์„œ ๋ฐ›๊ฒŒ ๋˜๋ฉด

char **argv๋ฅผ ํ†ตํ•ด ๋ฌธ์ž์—ด๋กœ ๋ฐ›๊ฒŒ ๋˜์–ด ์žˆ๋‹ค๋ณด๋‹ˆ, ๋ฌธ์ž์—ด๋กœ ์˜จ ์ˆซ์ž๊ฐ’์„ ์ •์ˆ˜ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ–ˆ๋‹ค.

๋”ฐ๋ผ์„œ atoi ํ•จ์ˆ˜๊ฐ€ ์—ฌ๊ธฐ์„œ ์ฐฐ๋–ก๊ฐ™์ด ์“ฐ์ด๊ฒŒ ๋˜์—ˆ๋‹ค.

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

"12345" ๋ผ๋Š” ๋ฌธ์ž์—ด์„ ์ •์ˆ˜๊ฐ’ 12345๋กœ ๋ฐ”๊ฟ” ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

์œ„์˜ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ์ˆœ์ฐจ์ ์œผ๋กœ ๋œฏ์–ด๋ณด์ž.

์šฐ์„  while๋ฌธ์„ ํ†ตํ•ด ๊ณต๋ฐฑ์ด๋‚˜ tab๊ณผ ๊ฐ™์€ whitespace๋ฅผ ๊ฑด๋„ˆ๋›ฐ๋Š” ์ž‘์—…์„ ํ•ด์ฃผ์—ˆ๋‹ค.

๊ทธ ํ›„, +๋‚˜ - ๊ฐ€ ์žˆ์œผ๋ฉด ์ธ๋ฑ์Šค๋ฅผ ํ•˜๋‚˜ ๊ฑด๋„ˆ ๋›ฐ๊ธฐ์œ„ํ•œ if๋ฌธ์„ ์ž‘์„ฑํ–ˆ๋‹ค.

๋˜ํ•œ '-' ์ผ๋•Œ๋Š” ์ถ”ํ›„์— ์Œ์ˆ˜๋กœ ๋ณ€ํ™˜ํ•ด์ค˜์•ผํ•˜๋ฏ€๋กœ, sign์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋ถ€ํ˜ธ๊ฐ’์„ -1๋กœ ์ง€์ •ํ–ˆ๋‹ค.

 

๊ทธ ์ดํ›„, while๋ฌธ์„ ํ†ตํ•ด ์ˆซ์ž๊ฐ’์ด ๋‚˜์˜ฌ ๋™์•ˆ ์ž๋ฆฌ์ˆ˜๋ฅผ ๋†’์—ฌ๊ฐ€๋ฉด์„œ ๊ฐ’์„ ์ €์žฅํ•ด์ฃผ๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณค๋‹ค.

long long int๋กœ ๊ฐ’๋“ค์„ ์„ ์–ธํ–ˆ๊ณ , ์›๋ž˜ atoi์™€ ๋™์ผํ•˜๊ฒŒ ๋”ฐ๋กœ overflow์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์•˜๋‹ค.

(๋ฐ˜ํ™˜์ด int์ด๋ฏ€๋กœ, ๊ฐ’์ด ๋„˜์ณค์„ ๋•Œ๋Š” ์•Œ์•„์„œ overflow ๋˜๋„๋ก ๋‘ .)

 

๊ทธ๋ฆฌ ์–ด๋ ต์ง€๋Š” ์•Š์€ ์ฝ”๋“œ์ด๋‚˜, ๋‚˜์ค‘์— ๋‹ค๋ฅธ ์ฝ”๋“œ์— ์ ์šฉ์‹œ์ผœ๋ณด๋‹ˆ,

overflow error handling์ด ์—†๋Š”๊ฒŒ ๋„ˆ๋ฌด ๋ถˆํŽธํ–ˆ๋‹ค. (์‹ค์ œ atoi ํ•จ์ˆ˜๋„ ์—†๋‹ค. -> ๋Œ€์•ˆ: strtol ํ•จ์ˆ˜๋Š” ์˜ค๋ฅ˜ ๊ฐ์ง€ ํ•ด์ค€๋‹ค.)

 

๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ upgrade ver. ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋’€๋‹ค.

 

* atoi_upgrade

int	do_atoi_upgrade(char *nptr, int *v)
{
	long long int	sign;
	long long int	n;
	int i;

	i = 0;
	n = 0;
	sign = 1;
	if (nptr[i] == '-')
	{
		sign = -1;
		i ++;
	}
	while (nptr[i] >= '0' && nptr[i] <= '9')
	{
		n = 10 * n + (nptr[i] - 48);
		i ++;
		if ((sign * n) > 2147483647 || (sign * n) < -2147483648)
		{
			(*v) = 1;
			return (0);
		}
	}
	return ((int)sign * (int)n);
}

 

์šฐ์„ , whitespace ๋ถ€๋ถ„์€ ๋‚ด๋ถ€์—์„œ ๊ณ ๋ คํ•˜์ง€์•Š๊ณ ,

์™ธ๋ถ€ ์ฝ”๋“œ์—์„œ ์ˆซ์ž๊ฐ’๋งŒ parsingํ•ด์„œ ๋“ค์–ด์˜จ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— ์ž‘์„ฑํ–ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ์‹œ์ž‘ ๋ถ€๋ถ„์— '-'๊ฐ€ ์žˆ์œผ๋ฉด sign๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ ,

+๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ˆซ์ž๋Š” parsing์—์„œ +๊ฐ€ ์‚ฌ๋ผ์ ธ์„œ ๋“ค์–ด์˜ค๊ฑฐ๋‚˜, ๋ฏธ๋ฆฌ ๊ฑธ๋Ÿฌ์ง€๊ฒŒ ๋’€๋‹ค.

 

๋‹ค๋ฅธ ๋ถ€๋ถ„์€ ๊ฐ™์ง€๋งŒ, while๋ฌธ๋‚ด์—์„œ int๊ฐ’ overflow์— ๋Œ€ํ•œ error handling ํŒŒํŠธ๋ฅผ ํ•˜๋‚˜ ๋„ฃ์—ˆ๋‹ค.

๋งค๋ฒˆ ์ž๋ฆฌ์ˆ˜๊ฐ€ ์˜ฌ๋ผ๊ฐˆ ๋•Œ๋งˆ๋‹ค, ๋ฐ˜ํ™˜ํ•  ๊ฐ’์ด int overflow๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํŒ๋ณ„ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด,

error flag์ธ v์˜ ๊ฐ’์„ 1๋กœ ๋ฐ”๊พธ๋„๋ก ์„ค์ •ํ•ด๋‘์—ˆ๋‹ค.

 

๊ธฐ์กด์— ๋งŒ๋“ค๋•Œ while๋ฌธ ๋ฐ–์— ์ด๋ฅผ ์ ์–ด๋’€์—ˆ๋Š”๋ฐ, ์ด๋Š” ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

-> overflow ๋œ ๊ฒฐ๊ณผ๊ฐ€ int ๋ฒ”์œ„ ์•ˆ์ชฝ์ด ๋˜์–ด๋ฒ„๋ฆฌ๋Š” ์ƒํ™ฉ์—์„œ, ์ด๋ฅผ ์˜ค๋ฅ˜๋กœ ๋ณด์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ.

(longlong MAX ๋ณด๋‹ค ๋” ํฌ๋ฉด์„œ longlong MAX + int MAX ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋ฉด overflow์ธ์ง€ ๋ชจ๋ฆ„ ..)

๋”ฐ๋ผ์„œ while๋ฌธ ์•ˆ์— ๋„ฃ์–ด int overflow ๋œ ์ดํ›„์— ๋ฐ”๋กœ return ํ•ด๋ฒ„๋ฆฌ๋„๋ก ํƒˆ์ถœ๊ตฌ๋ฅผ ๋งˆ๋ จํ–ˆ๋‹ค.

 

์ด๋กœ์จ, int๊ฐ’์ด ๋„˜์–ด๊ฐ€๋Š” ๊ฐ’์€ flag๋ฅผ ํ†ตํ•ด ๊ฑธ๋Ÿฌ์ฃผ๋Š” atoi_upgrade ๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜์—ˆ๋‹ค..

 

 

 

 

 

+) ํ™•์‹คํžˆ ๊ธฐ์กด์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ๋„˜์–ด์„œ์„œ ๊ฐ€๊ณตํ•˜๋ ค๋‹ˆ ์‰ฝ์ง€์•Š๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ค์—ˆ๊ณ ,

๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜๋„ ์ƒ๊ฐํ•  ๋ถ€๋ถ„๋“ค์ด ์ •๋ง ๋งŽ๋‹ค๊ณ  ๋А๊ผˆ๋‹ค. ์•„๋ฌด๋ž˜๋„ ์œ„์˜ ์ฝ”๋“œ๋„ ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด๋‚˜ ํ—ˆ์ ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค..

์ตœ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ๊ด€์ ์—์„œ ์ฝ”๋”ฉ์„ ํ•ด๋ด์•ผํ•  ๋“ฏํ•จ.