问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

彻底理解C语言中的atoi函数:作用、使用方法及实现原理

创作时间:
作者:
@小白创作中心

彻底理解C语言中的atoi函数:作用、使用方法及实现原理

引用
CSDN
1.
https://blog.csdn.net/2302_80198073/article/details/136986260

在学习C语言的时候,我们知道每个字符都有其所对应的ASCII码值,当我们使用49来打印字符时,打印出来的就是数字字符 '1',那么字符能否直接被转换成对应的整型数字呢?答案是当然可以,这时我们就需要使用atoi函数。

atoi函数的作用

先看一下官网对atoi函数的解释:

解释如下:

  • 参数:str -- 要转换为整数的字符串。
  • 返回值:该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。
  • 即把参数 str 所指向的字符串转换为一个整数(类型为int型)。

atoi函数的基本使用方法

我们直接使用实例来进行讲解:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    char str[] = "-54321";
    int ret = atoi(str);
    printf("%d", ret);
    return 0;
}

从上面的例子我们可以看出atoi函数将字符串“-54321”转换成了整数-54321,实现了将字符串直接转换成整型数据的操作,这也就是atoi函数的作用。

但是使用atoi函数还有几点使用细节需要注意:

atoi函数的使用细节:

  1. 使用atoi函数需要包含<stdlib.h>头文件;
  2. 当参数位置传入的为NULL指针时会报错,当参数位置传入的为空字符串时,返回值为0;
  3. atoi函数会自动过滤开始时的空白字符;
  4. atoi函数会根据字符串内容自动判断整数的正负;
  5. 当字符串的数字大小超过了整型数字的取值范围时,返回时会变为整型数据的最大或最小值;
  6. 当字符串中的数字有非10进制字符隔断时,atoi函数会直接返回当前位置前面的数字;

现对第2条、第3条、第5条、第6条进行实例演示:

第2条:当参数位置传入的为NULL指针时会报错,当参数位置传入的为空字符串时,返回值为0

#include<stdio.h>
#include<stdlib.h>
int main()
{
    char str[] = "241";
    int ret = atoi(NULL);
    printf("%d", ret);
    return 0;
}
#include<stdio.h>
#include<stdlib.h>
int main()
{
    char str[] = "";
    int ret = atoi(str);
    printf("%d", ret);
    return 0;
}

第3条:atoi函数会自动过滤开始时的空白字符

#include<stdio.h>
#include<stdlib.h>
int main()
{
    char str[] = "      -54321";
    int ret = atoi(str);
    printf("%d", ret);
    return 0;
}

第5条:当字符串的数字大小超过了整型数字的取值范围时,返回时会变为整型数据的最大或最小值

#include<stdio.h>
#include<stdlib.h>
int main()
{
    char str[] = "238947283649234";
    int ret = atoi(str);
    printf("%d", ret);
    return 0;
}

第6条:当字符串中的数字有非10进制字符隔断时,atoi函数会直接返回当前位置前面的数字

#include<stdio.h>
#include<stdlib.h>
int main()
{
    char str[] = "-543abc21";
    int ret = atoi(str);
    printf("%d", ret);
    return 0;
}

以上我们就了解了atoi函数的基本使用方法。

如何自我实现atoi函数

在自我实现atoi函数之前,让我们来梳理一下实现atoi函数的思路:

  1. 需要一开始就对参数进行判断,如果是NULL指针,则返回0,如果是空字符串则返回0
  2. 然后开始过滤字符串开始时的空白字符
  3. 判断字符串中的整型数据是正还是负
  4. 开始读取字符串中的整型数据直到遇到第一个非10进制字符

接下来看一下如何自我实现atoi函数:

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int myAtoi(const char * str)
{
    //判断是否是NULL指针或空白字符串
    if (str == NULL)
        return 0;
    if (str == '\0')
        return 0;
    //过滤空白字符
    while (isspace(*str))
    {
        str++;
    }
    //使用标志flag来判断数字正负
    int flag = 1;
    if (*str == '+')
    {
        flag = 1;
        str++;
    }
    else if (*str == '-')
    {
        flag = -1;
        str++;
    }
    //由于字符串里的数字可能大于int类型的最大值,所以使用long long类型变量记录数据
    long long ret = 0;
    while (*str != '\0')
    {
        //如果是10进制数据
        if (isdigit(*str))
        {
            ret = ret * 10 + (*str - '0') * flag;
            str++;
            if (ret > INT_MAX)
                ret = INT_MAX;
            if (ret < INT_MIN)
                ret = INT_MIN;
        }
        //如果不是10进制数据
        else
        {
            //由于atoi函数返回值为int类型,而刚才定义的变量是long long类型,所以要进行转换
            return (int)ret;
        }
    }
    return (int)ret;
}

上面代码中,每一个关键步骤都进行了解释,可以帮助读者更好的理解代码的实现!

以上就是atoi函数的所有内容了~~~

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号