[C言語]-atoi関数をシミュレートします

atoi()関数の機能:​​文字列を整数に変換します。atoi()はパラメータ文字列をスキャンし、先行するスペース文字をスキップして、数値または正と負の符号に遭遇するまで変換を開始します。非数値または文字列('\ 0')の場合、変換は終了し、結果が返されます(変換された整数を返します)。

パラメータを渡すときは、次の問題を解決する必要があります。

nullポインタ
空の文字列空白文字の前に+-オーバーフローが続く
非数字


#include <stdio.h>
#include <assert.h>
#include <ctype.h>
#include <limits.h>

enum Status
{
	VALID,//合法
	INVALID//非法
}status = INVALID;

int my_atoi(char* str)
{
	//空指针 
	assert(str);

	//空字符串
	if (*str == '\0')
	{
		return 0;
	}
	//空白字符
	while (isspace(*str))//查看是否为空白字符
	{
		str++;
	}
	//正负号
	int flag = 1;//正号
	if (*str == '+')
	{
		flag = 1;
	}
	else if (*str == '-')
	{
		flag = -1;
		str++;
	}

	long long n = 0;
	while (*str!='\0')
	{
		if(isdigit(*str))//查看是否为数字字符
		{
			n = n * 10 + flag * (*str - '0');
			if (n > INT_MAX || n < INT_MIN)
			{
				if (flag == 1)
				{
					return INT_MAX;
				}
				else if (flag == -1)
				{
					return INT_MIN;
				}
				break;
			}
		}
		else
		{
			break;
		}
		str++;
	}

	if (*str == '\0')
	{
		status = VALID;
	}
	 return (int)n;
}

int main()
{
	char arr[] = "111111111111111111111111";
	int ret = my_atoi(arr);
	if (status == VALID)
	{
		printf("正常转换:%d\n", ret);
	}
	else
	{
		printf("非法转换:%d\n", ret);
	}
	
	return 0;
}

ここでオーバーフローすると、正はINT_MAXを返し負はINT_MIN を返します。

おすすめ

転載: blog.csdn.net/qq_54880517/article/details/124080211