atoi() 구현하기

resister_boy·2022년 12월 4일
0
post-thumbnail

<stdlib.h>

Prototype

int	atoi(const char *str);

Arguments

const char *str: 숫자로 바꾸어 반환할 char 포인터 str

Return Value

atoi()는 char 포인터 str을 인자로 받아 공백 문자를 제거하고, 부호를 계산한 후 char 타입의 숫자를 int 타입의 숫자로 바꾸어 반환합니다.

Description

atoi()는 char 포인터 str를 인자로 받아 공백 문자를 제거하고, 부호를 계산한 후 char 타입의 숫자를 int 타입의 숫자로 바꾸어 반환합니다. 이때 인자로 받는 char 포인터가 가리키는 값은 상수이기 때문에 변경할 수 없습니다.

atoi()는 공백문자의 개수와 상관없이 모든 공백문자를 건너 뛰지만, 부호 또는 숫자 이후에 등장하는 공백문자는 계산할 수 없습니다. 즉, 부호와 숫자 앞에 위치한 공백 문자만 건너뛸 수 있으며, 중간에 공백문자가 등장할 경우 함수가 종료됩니다.

atoi()는 부호는 하나만 계산할 수 있습니다. 즉, '+'나 '-'를 각각 하나씩만 받을 수 있으며, '+-'나 '--'와 같은 부호는 입력받을 없습니다. 만일 이와 같은 방식의 부호를 입력받을 경우 함수가 종료됩니다.

atoi()는 공백 문자와 부호, 그리고 ASCII 코드 상 숫자로 표현할 수 없는 숫자가 있을 경우 함수가 종료됩니다. 즉, char 포인터가 가리키는 문자열에 공백 문자와 부호, 숫자 이외의 문자가 있을 경우 해당하는 문자를 만나게 되면 함수가 종료됩니다.

atoi()의 반환값은 숫자지만, atoi()의 원형은 인자로 받은 char 포인터를 strtod()에 넣어 반환합니다. 이때 strtod()는 double 타입을 반환합니다. 이때, int 타입은 4byte만큼의 숫자만 표현할 수 있는 반면, double 타입은 8byte만큼에 숫자까지 표현할 수 있기 때문에 숫자가 int 타입의 범위를 초과할 경우를 고려하여 같은 8byte 자료형인 long long int타입으로 반환해줍니다.

Code

  1. 부호의 상태를 관리해줄 변수 sign과 문자를 숫자로 바꾸어 반환할 변수 value를 선언해줍니다.

  2. 변수 sign은 1, value는 2로 초기화해줍니다.

  3. 인자로 받은 char 포인터가 가리키는 문자열을 돌면서 공백문자가 있는 경우 모두 건너뛰어줍니다.

  4. 공백문자를 모두 건너뛴 후 부호가 있는 경우에도 모두 건너뛰어줍니다.

  5. 만일 '-'를 만나게 되면 변수 sign에 -1을 곱해줍니다.

  6. 숫자를 만나게 될 경우 char 타입의 숫자에 -48을 하여 int 타입의 숫자로 만들어줍니다.

  7. 숫자를 만날 때마다 * 10를 해주어 이전에 만난 숫자들의 자릿수를 올려줍니다.

  8. 변수 sign과 변수 value를 곱한 값을 반환합니다.

int	my_atoi(const char *str)
{
	long long int	sign;
	long long int	value;

	sign = 1;
	value = 0;
	while (*str == '\t' || *str == '\n' || *str == '\v' \
			|| *str == '\f' || *str == '\r' || *str == ' ')
		str++;
	if (*str == '+' || *str == '-')
	{
		if (*str == '-')
			sign *= -1;
		str++;
	}
	while (*str >= 48 && *str <= 57)
	{
		value *= 10;
		value += *str - 48;
		str++;
	}
	return (value * sign);
}
profile
좋은 제품을 만드는 사람

0개의 댓글