my_itoa

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

char *strrev(char *src)
{
    assert(src != NULL);

    char *head = src;
    char *tail = src;
    char tmp;

    /* tail指向src末尾*/
    while (*tail++)
        NULL;
    tail--; //与tail++抵消
    tail--; //跳过末尾 \0

    /* 完成反转*/
    while (head < tail)
    {
        tmp = *head;
        *head++ = *tail;
        *tail-- = tmp;
    }

    return src;
}

void uint_to_str(uint32_t u, char *str)
{
    char *p = str;

    do
    {
        *p++ = u % 10 + '0'; //数字变字符
    }while ((u/=10) > 0);
    *p = '\0';

    str = strrev(str); //字符逆序
}

void int_to_str(int32_t i, char *str)
{
    if (i < 0)
    {
        *str++ = '-';
        i = -i;
    }

    //这里避免上溢
    //即假设i是16位,则 i = -32768 时, -i = -32768
    uint_to_str((uint32_t)i, str);
}

int32_t main(void)
{
    char tmp[30] = {'\0'};
    int32_t a = INT32_MAX, b = INT32_MIN;

    //a为int最大值
    int_to_str(a, tmp);
    printf("a = %s\n", tmp);

    //b为int最小值
    memset(tmp, 0, 30);
    int_to_str(b, tmp);
    printf("b = %s\n", tmp);

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值