您的位置:首页 > 其它

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

2017-07-26 22:29 127 查看
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 1
enum 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);
else
printf("不合法!");
getchar();
return 0;
}

好了,今天的代码完成了,加油!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: