atoi 関数とそのシミュレーション実装

 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! の値に基づいて意味が区別されます。

おすすめ

転載: blog.csdn.net/qq_48460693/article/details/133803494