函数名:atoi
功能: 把一个字符串转换成一个整数。
看似简单,主要是情况太多,需要注意考虑。
测试代码:
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("-");
详细代码:
#pragma once 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 != ' ') { bool minus = false;//是不是负号,初始化为不是 if (*str == '+') //考虑正号 str++; else if (*str == '-') { str++; minus = true; //是负号,minus置为真 } if (*str != ' ') { num = StrToIntCore(str, minus); } } return (int)num; } long long StrToIntCore(const char* digit, bool minus) { long long num = 0; while (*digit != ' ') //正负号处理完成 { 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 == ' ') //这种‘ ’为合法 { 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. ", string); else printf("number for %s is: %d. ", string, result); } void _Test() { 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("-"); }
分析:
1.有几种情况都是返回零,但是需要知道分别是什么情况,就用一个全局量g_nStatus去控制,是合法零还是非法零
2.minus控制整数的正负,true就是负号;
3.是非法输入,都有g_nStatus状态控制,在输出的时候,判断输出零时,g_nStatus的状态;
测试结果:
赐教!