【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;
}

你可能感兴趣的:(函数的模拟实现,数据结构,c++,算法,c语言,开发语言)