숫자 관련 함수 : atoi, isalpha, isdigit, isalnum, isascii, isprint, toupper, tolower
dqQQQ
·2023. 11. 25. 12:09
개요
인자값으로 들어온 값을 해당 함수의 조건에 맞춰 변환 및 판별을 해주는 함수를 알아보겠습니다.
atoi
SYNOPSIS
함수 원형
: int ft_atoi(const char *str)함수 라이브러리
: #include <stdlib.h>const char *str
: 세팅할 메모리의 주소리턴값
: 문자열에서 추출한 정수
DESCRIPTION
str으로 들어온 문자열을 검사한다.
화이트스페이스 문자와 부호 문자를 모두 건너뛰고 정수만 추출하여 정수형으로 반환한다.
atoi CODE
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 <ctype.h>int c
: 판별할 문자리턴값
: 함수가 원하는 조건에 부합하는 문자이면 1 아니면 0
DESCRIPTION
인자값으로 들어온 c를 해당하는 함수의 조건에 부합하는지 판별하여 부합하면 1 아니면 0을 리턴
is** CODE
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 <ctype.h>int c
: 바꿀 문자리턴값
: 바꾼 문자
DESCRIPTION
인자값으로 들어온 c를 해당하는 함수의 조건에 부합하는지 판별하여 부합하면 변환하여 리턴
to** CODE
int ft_to******(int c)
{
if (?? <= c && c <= ??)
c ?= 32;
return (c);
}
tolower == ('A' <= c && c <= 'Z')/ +
toupper == ('a' <= c && c <= 'z')/ -