编程题目:
实现字符串转整数函数,类似标准库函数中的stoi()
题目考核点是规范的编程习惯。我们得有一种编程信念:编写的函数不仅要实现指定的功能,还得能处理各种异常情况。所以,先罗列出所有的异常可能,对每一种异常找出对策,然后动手写出较周全的程序。
下面开始解决问题的思维过程:
既然将字符串转成整数,那么函数的参数就是字符串str,返回值就是int类型。可将函数声明为:
int StringToInt(const char *str); 确定函数原型后,继续分析可能的异常情况,找出7点:
①str为空指针
②str为空字符串(“”为空字符串)
③str中包含‘+’、‘-’字符
④str只含‘+’、‘-’字符
⑤str包含‘0’~'9'、‘+’、‘-’以外的字符
⑥返回值int类型的值溢出
⑦区别正常返回值与异常返回值
下面贴出博主的C++代码:
#include<iostream> using namespace std; enum status {invalid,valid};//枚举类型 int flag_status=invalid;//全局变量标记异常 int StringToInt(const char *str); long long StringToIntCore(const char *str,bool minus);//字符串转整型核心函数 int StringToInt(const char *str) { flag_status=invalid; int num=0; if(str!=NULL&&str!='\0')//str为空指针或空字符串返回零 { //处理正负号 bool minus=false; if(*str=='+') str++; else if(*str=='-') { str++; minus=true; } if(*str!='\0')//处理输入只有正负号情况 { num=StringToIntCore(str,minus); } } return (int)num; } long long StringToIntCore(const char *str,bool minus) { long long num=0; while (*str!='\0') { if(*str>='0'&&*str<='9')//转换‘0’~'9'之间的字符 { int flag=minus?-1:1;//条件运算符 num=num*10+flag*(*str-'0'); //判断num是否溢出 if((!minus&&num>0x7FFFFFFF)||(minus&&num<(signed int)0x80000000))//(signed int)0x80000000为int 型的最小负数,必须加signed int { num=0; break; } str++;//向后移动一位 } else { num=0; break; } } if(*str=='\0') flag_status=valid; return num; }