itoa和atoi函数的实现

itoa和atoi是两个常常考察的两个函数,下面是关于两个函数我的一个实现方法。

一、itoa的实现方法思路:
1、使用了static作为存储方式,考虑到32位和64位机器的int数据长度的不同,字符串数组设置也应该不同,同时负数应该给予标志位‘-’符号。
2、负数%余数仍是负数,在+‘0’时会出现错误。
3、字符串由于%从低位计算,所以需要翻转字符串。
以下是具体的实现代码:

#include<stdio.h>
#include<string.h>

char* my_itoa(int num)
{
    //0、定义储存的数组结构大小,初始化数组
#ifdef __INT64__
    static char ch[1 + 19 + 1]; //考虑到unsigned类型位20位 unsigned传值时需要 1 + 20 + 1
#else
    static char ch[1 + 10 + 1]; //-2x xxxx xxxx + '\0' 最大12位
#endif
    memset(ch, '\0', sizeof(ch));


    //1、设置标志位,设置字符串开始位置
    int ilow = 0, ihigh = 0;
    if (num < 0)
    {
        num = -num;
        ch[0] = '-';
        ilow = ihigh = 1;
    }

    //2.0、将num转换成文本,由于用%,自低位向高位保存,所以字符串是反向的
    do
    {
        ch[ihigh++] = num % 10 + '0';

    }while((num /= 10) > 0);

    //2.1、翻转字符串
    char *plow =  ch + ilow;
    char *phigh = ch + ihigh - 1; //ihigh 指向了'\0'

    char chTemp;
    while (plow < phigh)
    {
        chTemp = *plow;
        *plow = *phigh;
        *phigh = chTemp;
        plow++;
        phigh--;
    }
    return ch;
}

二、atoi的实现方法思路
1、输入的字符串应该检查地址是否为NULL,如果是,则报错,输出为0。
2、输入的字符串应该跳过空格和制表符。
3、输入的字符串应该有判断是否溢出,如有,输出溢出前的字符串,并且给出提示。
4、输入的字符串到非字符时停止。
具体代码如下:

int my_atoi(const char* str)
{
    if (NULL == str)
    {
        printf("错误:输入的字符串地址为NULL\n");
        return 0;
    }

    //0、过滤文本中的' '和'\t'制表符
    while ((*str == ' ') || (*str == '\t'))
        str++;

    //1、设置标志位
    int iflag = 1;
    if (*str == '+')
    {
        str++;
    }
    else if (*str == '-')
    {
        str++;
        iflag = -1;
    }
    else
    {
        NULL;
    }

    /* 2、字符串转换成数字,这里为了判断是否越界,需要设置两个int来判断大小,
       在未越界的情况下,前int的绝对值必定小于后int的绝对值。如果相反,则表
       示越界,应该用前一个int,并给出越界提示! */
    int iExitNum = 0; //代表有无字符串
    int iPreNum = 0, iNextNum = 0;
    while ((*str <= '9') && (*str >= '0'))
    {
        iExitNum = 1;
        iNextNum = iPreNum * 10 + (*str++ - '0');
        if (iNextNum < iPreNum)
        {
            printf("提示:字符串所表示的数字已经超出计算机所储存的int类型最大范围!\n");
            return iPreNum * iflag;
        }
        else
        {
            iPreNum = iNextNum;
        }
    }

    if (iExitNum == 0)
    {
        printf ("错误:该字符串前序数字!\n");
    }

    return iPreNum * iflag;
}

接下来我们写两个测试打印程序如下

void printf_itoa(int num)
{
    printf("输入数字为:%24d,输出字符串为:%24s\n", num, my_itoa(num));
}

void printf_atoi(const char* str)
{
    printf("输入字符串为:%24s,输出字符串为:%24d\n", str, my_atoi(str));
}

具体的测试如下:

int main()
{
    //测试程序 itoa
    printf("测试函数,my_itoa()\n");
    printf_itoa(123);
    printf_itoa(1234567890);
    printf_itoa(-123);
    printf_itoa(-12345678);
    printf_itoa(0);
    printf_itoa(-0);
    printf_itoa(-1234567890);

    //测试程序 atoi
    printf("测试函数, my_atoi()\n");
    printf_atoi("1234sdasdf");
    printf_atoi("+1234sdasdf");
    printf_atoi(" 1234sdasdf");
    printf_atoi(" +1234sdasdf");
    printf_atoi("   1234sdasdf");
    printf_atoi("   +1234sdasdf");
    printf_atoi("-1234sdasdf");
    printf_atoi(" -1234sdasdf");
    printf_atoi("   -12345678901sdasdf");
    printf_atoi("   -123456789sdasdf");
    printf_atoi("   -0sdasdf");
    printf_atoi(" +0sdasdf");
    printf_atoi("0sdasdf");
    printf_atoi("we-1234sdasdf");
    printf_atoi("eqw-1234sdasdf");
    printf_atoi(NULL);
    printf_atoi("   -23");
    printf_atoi("       -1234sdasdf");

    return 0;
}

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值