❤恋するコンピュータサイエンス❤

コンピュータサイエンス、3DCGをもっと楽しく、もっと本質的に!c言語、c++の記事中心です

【C言語】文字列を数値に変換する方法(atoi)

そもそも何故このようなatoi関数が必要かというと、コマンドラインで入力した文字列を、10進法のint型にする事で、入力した文字列→整数として扱う為だ。

下記の例をみてみよう。

例えば0,10という数値をコマンドラインに入力した場合、

"0"  → 0

"10" → 10

という変換をするのがatoiとなる。

この時点で実装の方針がたつ人は文字はASCII コードの対応している数値によって変換されているという前提を理解している人だ。

"0"  → 48(ASCII)  

"10" → "1"と"0"に分解され、それぞれascii の数値に対応している。

 

つまり上記の48という数値を引き算すれば整数になるという算段だ

 

 

下記atoiの実装だが、下記のプログラムの本質は先に説明した通りである。

文字列を

 

static int  isspace(char c)
{
    return (c == '\t' || c == '\n' || c == '\v'
        || c == '\f' || c == '\r' || c == ' ');
}

static int  is_over_flow(long num, int n, int is_minus)
{
    long    ov_div;
    long    ov_mod;

    ov_div = LONG_MAX / 10;
    ov_mod = *1
        str++;
    if (*str == '-' || *str == '+')
    {
        if (*str++ == '-')
            sign = -1;
    }
    while (ft_isdigit(*str))
    {
        if (is_over_flow(res, *str - '0', sign == -1))
        {
            if (sign == 1)
                return ((int)LONG_MAX);
            else
                return ((int)LONG_MIN);
        }
        res = res * 10 + *str++ - '0';
    }
    return (res * sign);
}

long をキャストしてint にしている。

*1:LONG_MAX % 10) + is_minus) % 10;

    if (num > ov_div)
        return (1);
    if (num == ov_div && ov_mod < n)
        return (1);
    return (0);
}

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

    res = 0;
    sign = 1;
    while (isspace(*str