标准库函数atoi用于将字符串类型的数据转换为整形数据:在转换过程中要考虑空指针、空字符串""、正负号,溢出等情况
这里是将字符串str转换为32位整型,其正数的最值为0x7FFFFFFF,负数的最小值为0x80000000(可参考有符号类型的最小负数的补码的由来),通过这两个值来判断是上溢还是下溢,此外,用一个全局变量来表明是否是非法输入的问题。
代码如下:(vs2010调试正确)
1 //实现atoi_32函数 2 //正数数的最大值为0x7FFFFFFF,最小值为0x80000000,考虑数字会溢出的情况 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <ctype.h> 6 7 enum {kValid = 0,kInvalid}; 8 int g_nStatus = kValid; //全局变量用于判断是非法输入还是字符串为空 9 10 long long StrToInt(const char *s,int sign) 11 { 12 long long num = 0; 13 while(*s != ‘\0‘){ 14 if(!isdigit(*s)){ 15 g_nStatus = kInvalid; //表示非法输入 16 num = 0; 17 break; 18 } 19 num = num * 10 + *s - ‘0‘; 20 if(sign > 0 && sign * num > 0x7FFFFFFF || 21 sign < 0 && sign * num < (signed int)0x80000000){ //注意这里的类型提升,因此要强制转换 22 num = 0; 23 break; 24 } 25 s++; 26 } 27 return sign * num; 28 } 29 int atoi_32(const char *s) 30 { 31 long long num; 32 int sign; 33 sign = 1; 34 35 if(s == NULL || *s == ‘\0‘){ 36 return 0; 37 } 38 if(*s == ‘+‘) 39 ++s; 40 else if (*s == ‘-‘){ 41 ++s; 42 sign = -1; 43 } 44 if (*s == ‘\0‘){ 45 g_nStatus = kInvalid; //表示非法输入 46 return 0; 47 } 48 else 49 num = StrToInt(s,sign); 50 51 return (int)num; 52 } 53 54 int main() 55 { 56 char s[1024]; 57 gets(s); 58 printf("%d\n",atoi_32(s)); 59 system("pause"); 60 return 0; 61 }
时间: 2024-10-11 22:47:23