模拟atoi函数,从字符串到数字的转化

来源:互联网 发布:淘宝男装店铺简介范文 编辑:程序博客网 时间:2024/06/05 19:20

atoi函数是将字符串转化为数字,这个函数可以面对任何错误的情况,是个强大的函数。今天我们就来模拟下它。

(1)考虑指针为空的情况

assert(str != NULL);

(2)考虑字符串为空的状况

if (*str == '\0')
{
return state;
}

state 是定义的一个全局变量,用来判断是否合法,首先赋值为不合法。

(3)考虑字符串前面是空白字符的情况,可以用isspace函数判断,(充分利用库函数)。

while (str&&isspace(*str))
{
str++;
}

(4)考虑是负数的情况

if (*str == '-')
{
flag = -flag;
str++;
}

flag的初始化为1,而-flag则为-1,相当于正负系数。

(5)考虑字符串前面是数字后面是其他字符的情况

else//非法字符
{
state = LEGAL;
return (int)ret;
}

这时截断后面的其他字符,返回计算的整型值。

(6)最后就是正常的情况了,数字字符

while (*str)
{
if (isdigit(*str))
{
ret = ret * 10 +( (*str) - '0')*flag;
if ((ret > INT_MAX) || (ret < INT_MIN))
{
return state;
}

}
else//非法字符
{
state = LEGAL;
return (int)ret;
}

该考虑的情况已经考虑完成,接下来就是整体的代码了

#include <ctype.h>#include <limits.h>#if 1enum LEGAL{LEGAL,ILLEGAL};enum LEGAL state = ILLEGAL;int my_atoi(char *str){int flag = 1;long long ret = 0;//指针为空assert(str != NULL);//空字符串if (*str == '\0'){return state;}//空白字符while (str&&isspace(*str)){str++;}//负数if (*str == '-'){flag = -flag;str++;}//数字while (*str){if (isdigit(*str)){ret = ret * 10 +( (*str) - '0')*flag;if ((ret > INT_MAX) || (ret < INT_MIN)){return state;}}else//非法字符{state = LEGAL;return (int)ret;}str++;}state = LEGAL;return (int) ret;}int main(){char str[] = "-12222222";int ret = my_atoi(str);if (state == LEGAL)printf("%d", ret);elseprintf("不合法!");getchar();return 0;}

好了,今天的代码完成了,加油!


原创粉丝点击