您的位置:首页 > 其它

算法--写一个函数检查字符是否是整数,如果是返回其整数值

2014-01-10 16:38 501 查看
     基础知识补充,对于一个给定的数字字符x,比如x=‘6’,如何求x所对应的数字6呢?我们知道计算机存储字符实际上存储的是其ASCII码,对于字符x=‘6’实际上存储的是ASCII码54,字符‘0’是48,‘1’是49.这样以来,对于任意一个数字字符x我们可以通过x-'0'的方式来求救其对于的数字值.

     下面分析一下如何求解字符串对于的数值.不失一般性,我们不妨以str="9652"作为例子分析。str对应的数值应为9652,如何和求解?一种直观的方法是取第一个数字9,让9与10^3相乘得乘积积,再取出6,让6与10^2相乘得乘积,最后把这些乘积加起来。这种办法需要求10的幂,应该摒弃,另寻更好的办法。可是怎么办呢?

     取出第一个数9,先临时把它看做最终结果r,再取出6,这里我们注意到r比6是高一位的,要想得到96只需9*10+6即可.那么就有递推式r=r*10+c,其中c为当前位对应的数值。根据这种思想我们可以得到递归算法:long atoi(char *str,int length){
if(length>1){
return str[0]=='-'?atoi(str,length-1)*10-(str[length-1]-'0'):atoi(str,length-1)*10+(str[length-1]-'0');
}else
return (str[0]=='-'||str[0]=='+')?0:str[0]-'0';
}
这里要注意要考虑到正号的情况,这种方法没有处理非数字字符问题有待于进一步的完善。

    非递归改进后的可容错代码如下:

long atoi(char *str,int length){
int i=0,sign=1,result=0;
if(str==NULL&&length<1)
return -1;
if(str[0]=='-')
sign=-1,i++;
else if(str[0]=='+')
i++;
//注意,这里一定要加上“i<length”这个条件。若是不加这个条件,则值isdigit(str[length])有可能返回true,
//即越界元素str[length]有是数字字符的可能性.这样以来程序就错了!
while(i<length&&'0'<=str[i]<='9')
result=result*10+str[i]-'0',i++;
if(i==length)
return result*sign;
return -1;
}但是方法在出错时返回-1,如果字符串本身就是-1得到的结果也是-1,那我们如何去区分呢?至今,我没有想到有什么办法解决,请大家不惜吝教!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐