本文参考了《字符串转换成整数》
题目描述
输入一个由数字组成的字符串,把它转换成整数并输出。例如:输入字符串”123”,输出整数123。
给定函数原型int StrToInt(const char *str) ,实现字符串转换成整数的功能,不能使用库函数atoi。
分析与解法
本题考查的实际上就是字符串转换成整数的问题,或者说是要你自行实现atoi函数。那如何实现把表示整数的字符串正确地转换成整数呢?以”123”作为例子:
1.当我们扫描到字符串的第一个字符’1’时,由于我们知道这是第一位,所以得到数字1。
2.当扫描到第二个数字’2’时,而之前我们知道前面有一个1,所以便在后面加上一个数字2,那前面的1相当于10,因此得到数字:1*10+2=12。
3.继续扫描到字符’3’,’3’的前面已经有了12,由于前面的12相当于120,加上后面扫描到的3,最终得到的数是:12*10+3=123。
完整代码如下:(与参考网址不同)
#include<stdio.h>
#include<string.h>
#define MAX_INT 4294967295 //不考虑正负,所以2的32次方就是这个值
int StrToInt(const char * str)
{
int i;
int sum=0;
int multiple=1;
if(str==NULL)//如果指针是空,则异常退出;
return -1;
for(i=0;i<=strlen(str)-1;i++)
{
printf("the (int)str[i]-48 is %d and the sum is %d\n",str[i]-48,sum);
if(sum>(MAX_INT/10) || (( sum==MAX_INT/10) && (str[i]-48)>(MAX_INT%10)))
{
return -2;//代表超出int 的表示范围了;
}
sum=sum*multiple+(str[i]-48);
multiple=10;
}
return sum;
}
int main()
{
int calsum=0;
char *str1="4294";
calsum=StrToInt(str1);
printf("%d\n",calsum);
return 0;
}
重点:(参考网址的内容)
一直以来,我们努力的目的归根结底是为了更好的处理溢出,但上述第二种处理方式考虑到直接计算n * 10 + c 可能会大于MAX_INT导致溢出,那么便两边同时除以10,只比较n和MAX_INT / 10的大小,从而巧妙的规避了计算n*10这一乘法步骤,转换成计算除法MAX_INT/10代替,不能不说此法颇妙。
参考网址:
《字符串转换成整数》