008将字符串转换为整数

来源:互联网 发布:缉毒警察知乎 编辑:程序博客网 时间:2024/06/05 12:04

题目描述

输入一个由数字组成的字符串,把它转换成整数并输出。例如:输入字符串"123",输出整数123。

给定函数原型int StrToInt(const char *str) ,实现字符串转换成整数的功能,不能使用库函数atoi。

思路:对于字符串“123”,计算过程是n = n*10 + c,其中,n是最后所求数字,c是当前数字,线性扫描即可

但是还需要考虑其他问题,一是空指针;二是符号问题,“+”,“-”;三是非法字符问题;四是整数溢出。

空指针直接退出,符号用sign表示,非法字符用isDigit()进行判断,对于整数溢出,

当整数发生溢出时,取最大或最小的int值,int的表示范围是MAX_INT:2147483647,MIN_INT:-2147483648。

判断n与MAX_INT和MIN_INT的关系,如果n>MAX_INT/10,那么n=n*10+c必然大于MAX_INT,如果n==MAX_INT,则判断c和MAX_INT%10的关系,如果c>MAX_INT%10,那么n=n*10+c>MAX_INT,对于MIN_INT,判断方法相似,只不过MIN_INT = -MAX_INT-1,需要单独判断

bool isDigit(char c){if(c>='0' && c<='9')return true;return false;}bool isSpace(char c){if(c == ' ')return true;return false;}int StrtoInt(const char *string){const int MAX_INT = 2147483647;const int MIN_INT = -2147483648;unsigned int n = 0;const char* str = string ;while(isSpace(*str)){str ++;}bool sign = true;if(*str == '-'){sign = false;str++;}else if(*str == '+'){str++;}else if(isDigit(*str)){}else {return 0;}while(isDigit(*str)){int c = *str - '0';if(sign && (n>MAX_INT/10 || (n==MAX_INT/10 && c > MAX_INT%10))){return MAX_INT;}else if( !sign && (n>(unsigned)MIN_INT/10) || (n==(unsigned)MIN_INT/10 && c> (unsigned)MIN_INT%10)){return MIN_INT;}else{n = n*10 +c;str ++;}}if(*str == '\0'){ if(sign){return n; }else{return -1 * n;}}return 0;}

举一反三

  1. 实现string到double的转换《待续。。。》

分析:此题虽然类似于atoi函数,但毕竟double为64位,而且支持小数,因而边界条件更加严格,写代码时需要更加注意。


0 0
原创粉丝点击