来源:剑指OFFER面试题49.
#include <stdio.h>
#include <stdlib.h>
enum Status{
VALID = 0,
INVALID
};
int g_status = VALID;
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_status = VALID;
}
return num;
}
int StrToInt(const char* str)
{
g_status = INVALID;
long long num = 0;
if (str != NULL && *str != '\0') // 处理NULL指针以及空字符串
{
bool minus = false;
if (*str == '+') // 处理正号
{
str++;
}
else if (*str == '-') // 处理负号
{
str++;
minus = true;
}
if (*str != '\0') // 核心功能
{
num = StrToIntCore(str, minus);
}
}
return (int)num;
}
void Test(char* input_string)
{
int result = StrToInt(input_string);
if (result == 0 && g_status == INVALID)
{
printf("The input %s is invalid.\n", input_string);
}
else
{
printf("Int value for %s is : %d.\n", input_string, result);
}
}
int main(int argc, char* argv)
{
// 特殊输入测试
Test(NULL); // NULL指针
Test(""); // 空字符串
Test("1a33"); // 含有非数字字符的字符串
Test("+"); // 只含正号
Test("-"); // 只含负号
// 边界值测试
//有效的最大正整数, 0x7FFFFFFF
Test("+2147483647");
Test("-2147483647");
Test("+2147483648");
//有效的最小负整数, 0x80000000
Test("-2147483648");
Test("+2147483649");
Test("-2147483649");
// 功能测试
Test("123");
Test("+123");
Test("-123");
Test("+0"); // 含有正好
Test("-0"); // 含有负号
return 0;
}