숫자 관련 함수 : 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')/ -