atoi の関数宣言と機能は以下のとおりです。
この関数の機能は文字列を整数に変換するので、正確に何をするのか
まずいくつかの例を見てみましょう。
文字列内の数字の前に空白文字がある場合、空白文字は削除されます。
文字列の途中に文字がある場合は、文字の前の数字のみが変換されます。
文字列数値が最大整数表現の範囲を超える場合は、最大整数値を返します(最小値も同様)。
スペースの後の最初の文字が文字の場合は、0 が返されます。
したがって、実装をシミュレーションするときは、上記の不正な入力状況を考慮する必要があります。
1. 空の文字列
2.空白文字
3. +-記号の処理
4. 大きすぎる値と小さすぎる値
5. 数字の途中に他の文字がある
atoi シミュレーションの実装:
#include <stdio.h>
#include <ctype.h>
#include <assert.h>
#include <stdlib.h>
enum State
{
VALID,
INVALID
}sta = INVALID;//默认设置为非法
int my_atoi(const char* str)
{
//空指针
assert(str);
//空字符串
if (*str == '\0')
return 0;
//跳过空白字符
while (isspace(*str))
{
str++;
}
//处理+-
int flag = 1;
if (*str == '+')
{
flag = 1;
str++;
}
else if(*str == '-')
{
flag = -1;
str++;
}
long long r = 0;
while (*str)
{
if(isdigit(*str))
{
r = r * 10 + flag*((long long)*str - '0');
if (r > INT_MAX || r < INT_MIN)
{
if (flag == 1)
return INT_MAX;
else
return INT_MIN;
}
str++;
}
else
{
return (int)r;
}
}
sta = VALID;
return (int)r;
}
int main()
{
char arr[] = " 12ab34";//加几个空格
int ret = my_atoi(arr);
if (sta == VALID)
printf("合法的转换:%d\n", ret);
else
printf("非法的转换:%d\n", ret);
return 0;
}
シミュレーションの実装プロセス中に、曖昧さを避けるために列挙型 State を定義しました。たとえば、空の文字列が my_atoi に渡されると、関数は 0 を返します。同時に、文字列 "0" が my_atoi に渡されると、関数も0を返す必要があり、曖昧さが避けられないため、このような列挙型を定義しています 列挙型変数staは列挙型を使用して定義されています 初期値はINVALIDです 関数が正常に戻った場合、staはVALIDに設定されます、最終的には sta! の値に基づいて意味が区別されます。