标签:for NPU ++ div 无效 printf class 试题 argc
// 面试题67:把字符串转换成整数 // 题目:请你写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不 // 能使用atoi或者其他类似的库函数。 #include <iostream> 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;//可能是大数,注意long long if (str != nullptr && *str != ‘\0‘)//无效输入情况,空指针和头结点为‘\0‘ { bool minus = false;//设置局部变量,反映正负号 if (*str == ‘+‘) str++; else if (*str == ‘-‘) { str++; minus = true; } if (*str != ‘\0‘)//需要再次判断 num = StrToIntCore(str, minus); } return (int)num; } long long StrToIntCore(const char* digit, bool minus) { long long num = 0; while (*digit != ‘\0‘)//如果不为‘\0‘ { if (*digit >= ‘0‘ && *digit <= ‘9‘)//且字符是0~9之间的字符 { int flag = minus ? -1 : 1;//是负数吗 num = num * 10 + flag * (*digit - ‘0‘);//使用负数加到num里 if ((!minus && num > 0x7FFFFFFF)//如果向上溢出了,还有一个符号位供缓冲 || (minus && num < (signed int)0x80000000))//向下溢出,同理,都返回0 { num = 0; break; } digit++; } else//要是有非正常字符,返回0 { num = 0; break; } } if (*digit == ‘\0‘)//如果只有字符‘0‘,g_nStatus是有效的,其他返回0的情况,g_nStatus都是无效的 g_nStatus = kValid; return num; } // ====================测试代码==================== void Test(const 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(int argc, char* argv[]) { Test(nullptr); 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; }
标签:for NPU ++ div 无效 printf class 试题 argc
原文地址:https://www.cnblogs.com/CJT-blog/p/10551470.html