そもそも何故このような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;
str++;
if (*str == '-' || *str == '+')
{
if (*str++ == '-')
}
while (ft_isdigit(*str))
{
if (is_over_flow(res, *str - '0', sign == -1))
{
return ((int)LONG_MAX);
else
return ((int)LONG_MIN);
}
res = res * 10 + *str++ - '0';
}
}
long をキャストしてint にしている。
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;
res = 0;
while (isspace(*str