atoi函数的实现

atoi函数要求

我所实现的atoi函数有以下几个要求
1,这个函数需要丢弃之前的空白字符,直到找到第一个非空白字符。之后从这个字符开始,选取一个可选的正号或者符号后面跟随尽可能多的数字,并将其解释为数字的值。

2,字符串可以在形成整数的字符后包括多余的字符,将这些字符忽略,这些字符对于函数的行为没有影响。

3,如果字符串中的第一个非空白的字符不是有效的整数,或者没有这样的序列存在,字符串为空或者只包含空白字符则不进行转换。

4,如果不能执行有效的转换,则返回 0。如果正确的值超过的可表示的范围,则返回INT_MAX(2147483647)或 INT_MIN(-2147483648)。


小码哥要开始码代码啦!!!

#include<stdio.h>

#define INT_MAX 2147483647
#define INT_MIN -2147483678
//两个宏定义代表整型的边界值

long long strtoi(char *str,bool minus); //该处为strtoi函数的声明,定义成longlong类型,是为了判断比整型边界值更大和更小的值。

//该函数主要用于判断非空格首字符,接收遍历函数strtoi所传回来的整型值
int my_atoi(const char *str)
{
    int num = 0;//num用来表示所转换后的整数值
    if(str != NULL && *str != '\0')//等于NULL直接返回0
    {
        while(*str == ' ')//如果首字符是空格,那就接着向后遍历,直到找到第一个非空格的字符
        {
            ++str;
            continue;
        }
        bool minus = false;//设置一个标志,来判断该数的正负
        if(*str == '+')
        {
            ++str;
        }
        else if(*str == '-')
        {
            ++str;
            minus = true;//true代表该数为负数
        }
        if(*str != '\0')
        {
            num = strtoi(str,minus);
        }
    }   
    return num;
}

//strtoi函数时遍历其余所有的字符
long long strtoi(const char *str,bool minus)
{
    long long num = 0;
    while(*str != '\0')
    {
        if(*str >=0 && *str <= 9)//0-9为合法数字
        {
            int flag = minus ? -1 : 1; //代表该值的正负
            num = num * 10 + flag * (*str - '0');//将字符转换为相应的数字
        if(!minus && num > 0x7FFFFFFF)//整型最大值2的31次方-1
        {
            return INT_MAX;
        } 
        else if(minus && num < (signed int)0x80000000)//整型最小值-2的31次方
        //由于整型默认为无符号整型,所有比较负数大小时,要强转为有符号整型
        {
            return INT_MIN;
        }
        ++str;
        }
        else //遇到非法字符直接结束循环,返回当前的num
        {
            break;
        }
    }
    return num;
}
int main()
{
    char str[100] = {0};
    scanf("%s",str);
    int k = my_atoi(str);
    printf("%d\n",k);
    return 0;
}

测试用例

常规数值测试

上边界值测试

下边界值测试

异常值测试
测试用例还有很多,由于考虑到大家的观赏性,小码哥就举了这四类,大家可以自己去多测几组。


atoi函数的实现就到这里,码友们有什么问题可以给小码哥我留言,我会及时解决大家的问题。

码完,收工啦。

猜你喜欢

转载自blog.csdn.net/xzg_2017/article/details/79935299
今日推荐