Welcome

首页 / 软件开发 / 数据结构与算法 / 剑指offer之字符串转整数

剑指offer之字符串转整数2015-10-04题目描述:

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。

输入:

输入可能包含多个测试样例。

对于每个测试案例,输入为一个合法或者非法的字符串,代表一个整数n(1<= n<=10000000)。

输出:

对应每个测试案例,

若输入为一个合法的字符串(即代表一个整数),则输出这个整数。

若输入为一个非法的字符串,则输出“My God”。

样例输入:5-5+8样例输出:5-58    关于这道题目,题目本身还是不错的,真正核心的代码也就那么两行,大部分代码基本都在做非法输入的检查。

最近做这几道题目,对九度后台的测试用例有点无语了,这道题目的测试用例应该有问题,我写的代码自己测试了很多种不同的非法输入以及合法输入,都没问题,但是在九度OJ上只有第四条测试用例通过,其他四条全部WA,害的我搞了一个晚上,后来下了个别人AC的代码,拿来测试了下,结果各种非法的输入都没处理,很多非法的输入,得到的都是些五花八门的答案。

先贴上代码,大家帮我看下有木有没考虑到的地方:

#include<stdio.h>#include<stdbool.h>bool IsValid;long StrToIInt(const char *str){//非法输入if(str == NULL){IsValid = false;return 0;}//是否为负数bool IsMinus = false;//跳过前面的空白字符while(*str == " ")str++;//第一个非空白字符为+号if(*str == "+")str++;//第一个非空白字符为-号else if(*str == "-"){str++;IsMinus = true;}//如果只输入了空白字符、符号位,或者什么都没输入,也为非法输入if(*str == ""){IsValid = false;return 0;}//后面的输入如果合法,则转化为整数long num = 0; //转化为整数后的结果//这样可以使类似234asd的输入也判定为合法输入,得到的结果为234while(*str != ""){//输入不在0-9之间,属于非法输入if(*str<"0" || *str>"9"){IsValid = false;return 0;}//对不包含符号位的合法输入进行转换num = 10*num + (*str - "0");str++;}//根据符号位转换正负num = IsMinus ? (-1*num) : num;//判断是否溢出了int的范围if(num>0X7FFFFFFF || num<(signed int)0X80000000){IsValid = false;return 0;}//上面没有返回,则说明合法并没有发生溢出return num;}int main(){static char str[100000000];while(gets(str) != NULL){IsValid = true;long result = StrToIInt(str);if(IsValid)printf("%ld
",result);elseprintf("My God
");}return 0;}