atoi, isalpha, isdigit, isalnum, isascii, isprint, toupper, tolower

개요

인자값으로 들어온 값을 해당 함수의 조건에 맞춰 변환 및 판별을 해주는 함수를 알아보겠습니다.


atoi


SYNOPSIS

  • 함수 원형 : int ft_atoi(const char *str)
  • 함수 라이브러리 : #include
  • const char *str : 세팅할 메모리의 주소
  • 리턴값 : 문자열에서 추출한 정수


DESCRIPTION

str으로 들어온 문자열을 검사한다.

화이트스페이스 문자와 부호 문자를 모두 건너뛰고 정수만 추출하여 정수형으로 반환한다.


atoi CODE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
static void	skip(const char *str, int *i, int *sign)
{
	while ((9 <= str[*i] && str[*i] <= 13) || str[*i] == 32)
		(*i)++;
	if (str[*i] == '+' || str[*i] == '-')
	{
		if (str[*i] == '-')
			*sign = -1;
		(*i)++;
	}
}

int		ft_atoi(const char *str)
{
	int			i;
	int			sign;
	long long	ret;

	i = 0;
	sign = 1;
	ret = 0;
	skip(str, &i, &sign);
	while ('0' <= str[i] && str[i] <= '9' && str[i])
	{
		if ((ret = ret * 10 + str[i] - '0') > 2147483647)
		{
			if (ret == 2147483648)
				return (-2147483648);
			else
			{
				if (sign == -1)
					return (0);
				else
					return (-1);
			}
		}
		i++;
	}
	return (sign * (int)ret);
}

skip함수는 화이트 스페이스와 공백을 모두 건너뛰는 함수이다.

특이한 점으로는 skip함수 앞에 static을 사용했다. 이는 정적함수로 구현한 것을 의미하며 정적함수로 구현할 경우에는 같은 소스코드 안에서만 사용할 수 있다.

static을 붙여줌으로써 같은 이름의 함수를 다른 소스코드에서 선언하고 같이 컴파일을 돌려도 에러가 나지 않게 된다.

안정성을 좀 더 부여하므로 붙여주는 습관을 기르도록 하자.

atoi함수에서 리턴해줄 변수를 long long으로 선언해준것은 -2147483648 때문이다.

나는 함수를 설계할 때 음수가 들어오면 우선 계산은 양수로 진행한 후 마지막에 음수를 계산해주도록했다.

int의 범위는 -2147483648 ~ 2147483647 까지 이므로 표현을 할 수가 없다.

atoi함수에서 int형을 벗어나는 문자열을 변환해야한다면 리턴값이 부호에 따라 다르다.




is**


SYNOPSIS

  • 함수 원형 : int is*****(int c);
  • 함수 라이브러리 : #include
  • int c : 판별할 문자
  • 리턴값 : 함수가 원하는 조건에 부합하는 문자이면 1 아니면 0


DESCRIPTION

인자값으로 들어온 c를 해당하는 함수의 조건에 부합하는지 판별하여 부합하면 1 아니면 0을 리턴


is** CODE

1
2
3
4
5
6
7
int	ft_is******int c)
{
	if ((?? <= c && c <= ??) || (?? <= c && c <= ??))
		return (1);
	else
		return (0);
}
isalpha == (‘a’ <= c && c <= ‘z’)   (‘A’ <= c && c <= ‘Z’)
isalnum == (‘a’ <= c && c <= ‘z’)   (‘A’ <= c && c <= ‘Z’)   (‘0’ <= c && c <= ‘9’)

isascii == (0 <= c && c <= 127)

isdigit == (‘0’ <= c && c <= ‘9’)

isprint == (32 <= c && c <= 126)




to**


SYNOPSIS

  • 함수 원형 : int to*****(int c);
  • 함수 라이브러리 : #include
  • int c : 바꿀 문자
  • 리턴값 : 바꾼 문자


DESCRIPTION

인자값으로 들어온 c를 해당하는 함수의 조건에 부합하는지 판별하여 부합하면 변환하여 리턴


to** CODE

1
2
3
4
5
6
int	ft_to******(int c)
{
	if (?? <= c && c <= ??)
		c ?= 32;
	return (c);
}

tolower == (‘A’ <= c && c <= ‘Z’)/ + toupper == (‘a’ <= c && c <= ‘z’)/ -




3줄 요약

1. atoi를 풀려면 화이트스페이스와 자료형의 범위를 정확히 알아햐한다.

2. atoi를 제외한 나머지 함수는 간단하다.

3. 함수들을 한번 구현해봄으로써 사용할 때 정확히 알고 사용할것같다. 좋은 경험이다.