题目:模拟实现atoi(字符串转换为整数)函数,比如“12345”转换后就是12345。
解析:要考虑的边界问题:
(1) NULL输入。
(2) 非法字符输入(如果只考虑十进制,除了正负号和数字,其他都是非法输入,若还要考虑十六进制,需要判断第二个字符是不是'X')。
(3) 只有一个正负号的输入。
(4) 空字串“”输入。
(5) 非法输入后返回值如果规定为0,如何区分正常的‘0’输入和异常输入的结果 (需要定义全局异常变量,若检测出异常,则给其设置值,这也是C++中异常处理的一种典型方式)。
(6) 溢出处理,输入的字符串已经超出int表示范围[-231-1, 231] [0x80000000, 0x7FFFFFFF]。
完整代码及其测试实现:
#include <iostream>
using namespace std;
long long StrToIntCore(const char* str, bool minus);
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 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;
}
// ====================测试代码====================
void Test(char* string)
{
int result = StrToInt(string);
if (result == 0 && g_nStatus == kInvalid)
printf("the input %s is invalid.\n", string);
else
printf("number for %s is: %d.\n", string, result);
}
int main()
{
Test(NULL);
Test("");
Test("123");
Test("+123");
Test("-123");
Test("1a33");
Test("+0");
Test("-0");
//有效的最大正整数, 0x7FFFFFFF
Test("+2147483647");
Test("-2147483647");
Test("+2147483648");
//有效的最小负整数, 0x80000000
Test("-2147483648");
Test("+2147483649");
Test("-2147483649");
Test("+");
Test("-");
system("pause");
return 0;
}
运行结果:
the input (null) is invalid.
the input is invalid.
number for 123 is: 123.
number for +123 is: 123.
number for -123 is: -123.
the input 1a33 is invalid.
number for +0 is: 0.
number for -0 is: 0.
number for +2147483647 is: 2147483647.
number for -2147483647 is: -2147483647.
the input +2147483648 is invalid.
number for -2147483648 is: -2147483648.
the input +2147483649 is invalid.
the input -2147483649 is invalid.
the input + is invalid.
the input - is invalid.
请按任意键继续. . .