【c语言进阶】atoi函数的介绍及模拟实现

【函数说明】

atoi() 函数会扫描参数 str 字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),
直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时(‘\0’)才结束转换,并将结果返回。

【返回值】返回转换后的整型数

如果 str 不能转换成 int 或者 str 为空字符串,那么将返回0

int my_atoi(const char* str)
{
    assert(str);

    char* pos1;//用于记录数字的最高位
    char* pos2;//用于记录数字的最低位,pos2-pos1即可算出数字的位数
    while (   
            (   *str == ' ' || 
                ((*str) < '0' )||
                ((*str) > '9')
            ) && *str !=  '\0'
          )
    {
        str++;
    }
    if (*str == '\0')//如果遇到str不能转换则返回0
    {
        return 0;
    }
    pos1 = str;
    char* star = str;//此时的str(star)指向第一个数字字符
    while (*str >= '0' && *str <= '9')
    {
        str++;
    }
    pos2 = str -1;//此时指向最后一位数
    int len = pos2 - pos1 + 1;//计算数字的位数
    int* pc = (int*)malloc(len * sizeof(int));
    int i = 1;//我们这里就从1开始计数吧,0的位置不要了,不习惯
    while ((*star) >= '0' && (*star) <= '9')
    {
        pc[i] = *star - 48;
        star++;
        i++;
    }
    //现在数组pc中存放的是所有的数字,len存放的是数字的位数,现在就把他们转换过来
    int num = 0;
    int ten = 1;
    for (int j = len; j > 0; j--)
    {
        num += pc[j] * ten;
        ten *= 10;
    }
    if (*(pos1 - 1) == '-')
    {
        return -num;
    }
    return num;
}

int main(void)
{
    char str[] = "       sd-s-sdsd";
    int ret = my_atoi(str);
    printf("%d\n",ret );
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值