剑指offer经典面试编程题--atoi()实现

考察是否具有良好的编程习惯:写代码之前应该考虑所有可能的测试用例。
1、要考虑到输入的字符串中有非数字字符和正负号。
2、要考虑到最大的正整数和最小的负整数以及溢出。
3、要考虑到当输入的字符串不能转换成整数时,应该如何做错误处理。

参考代码如下:

enum Status { kValid = 0, kInvalid };
int g_nStatus = kValid;

int StrToInt(const char* str)
{
	g_nStatus = kInvalid;
	long long num = 0;

	if (str != NULL && *str != '\0')
	{
		bool minus = false;
		if (*str == '+')
			str++;
		else if (*str == '-')
		{
			str++;
			minus = true;
		}

		if (*str != '\0')
		{
			num = StrToIntCore(str, minus);
		}
	}

	return (int)num;
}

long long StrToIntCore(const char* digit, bool minus)
{
	long long num = 0;

	while (*digit != '\0')
	{
		if (*digit >= '0' && *digit <= '9')
		{
			int flag = minus ? -1 : 1;
			num = num * 10 + flag * (*digit - '0');

			if ((!minus && num > 0x7FFFFFFF)
				|| (minus && num < (signed int)0x80000000))
			{
				num = 0;
				break;
			}

			digit++;
		}
		else
		{
			num = 0;
			break;
		}
	}

	if (*digit == '\0')
	{
		g_nStatus = kValid;
	}

	return num;
}

你可能感兴趣的:(c++)