标准库函数atoi用于将字符串类型的数据转换为整形数据:在转换过程中要考虑空指针、空字符串""、正负号,溢出等情况

这里是将字符串str转换为32位整型,其正数的最值为0x7FFFFFFF,负数的最小值为0x80000000(可参考有符号类型的最小负数的补码的由来),通过这两个值来判断是上溢还是下溢,此外,用一个全局变量来表明是否是非法输入的问题。

代码如下:(vs2010调试正确)

 //实现atoi_32函数
//正数数的最大值为0x7FFFFFFF,最小值为0x80000000,考虑数字会溢出的情况
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h> enum {kValid = ,kInvalid};
int g_nStatus = kValid; //全局变量用于判断是非法输入还是字符串为空 long long StrToInt(const char *s,int sign)
{
long long num = ;
while(*s != '\0'){
if(!isdigit(*s)){
g_nStatus = kInvalid; //表示非法输入
num = ;
break;
}
num = num * + *s - '';
if(sign > && sign * num > 0x7FFFFFFF ||
sign < && sign * num < (signed int)0x80000000){ //注意这里的类型提升,因此要强制转换
num = ;
break;
}
s++;
}
return sign * num;
}
int atoi_32(const char *s)
{
long long num;
int sign;
sign = ; if(s == NULL || *s == '\0'){
return ;
}
if(*s == '+')
++s;
else if (*s == '-'){
++s;
sign = -;
}
if (*s == '\0'){
g_nStatus = kInvalid; //表示非法输入
return ;
}
else
num = StrToInt(s,sign); return (int)num;
} int main()
{
char s[];
gets(s);
printf("%d\n",atoi_32(s));
system("pause");
return ;
}

PS:参考《剑指offer》

04-30 10:52