打印
[STM32F1]

itoa函数思路是什么啊

[复制链接]
1581|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电子过客|  楼主 | 2015-5-7 10:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
*
* 函数名:itoa
* 描述  :将整形数据转换成字符串
* 输入  :-radix =10 表示10进制,其他结果为0
*         -value 要转换的整形数
*         -buf 转换后的字符串
*         -radix = 10
* 输出  :无
* 返回  :无
* 调用  :被USART2_printf()调用
*/
static char *itoa(int value, char *string, int radix)
{
    int     i, d;
    int     flag = 0;
    char    *ptr = string;

    /* This implementation only works for decimal numbers. */
    if (radix != 10)
    {
        *ptr = 0;
        return string;
    }

    if (!value)
    {
        *ptr++ = 0x30;
        *ptr = 0;
        return string;
    }

    /* if this is a negative value insert the minus sign. */
    if (value < 0)
    {
        *ptr++ = '-';

        /* Make the value positive. */
        value *= -1;
    }

    for (i = 10000; i > 0; i /= 10)
    {
        d = value / i;

        if (d || flag)
        {
            *ptr++ = (char)(d + 0x30);
            value -= (d * i);
            flag = 1;
        }
    }

    /* Null terminate the string. */
    *ptr = 0;

    return string;

} /* NCL_Itoa */


沙发
aozima| | 2015-5-7 12:00 | 只看该作者
用标准库中的 sprintf 就妥了,省时省力。

使用特权

评论回复
板凳
戈卫东| | 2015-5-7 13:10 | 只看该作者
aozima 发表于 2015-5-7 12:00
用标准库中的 sprintf 就妥了,省时省力。

它是作为printf的下层的。。。。。

使用特权

评论回复
地板
戈卫东| | 2015-5-7 13:13 | 只看该作者
不是标准的itoa,它这个只能接受很小的数,标准itoa能接受最长32BIT

使用特权

评论回复
5
airwill| | 2015-5-7 14:32 | 只看该作者
用标准库中的 sprintf 就妥了,省时省力?  程序员是省时省力了,但 MCU 很累啊。
这不是 printf() 的底层函数,而是  string 里的函数。比使用 sprintf 速度极大地快。
不过这个函数只接受 16位的整数,效率也还是有提升的空间。
Cortex-M3 是32位机了,很容易扩展成 32 位:
for (i = 1000000000; i > 0; i /= 10)

使用特权

评论回复
6
戈卫东| | 2015-5-7 15:50 | 只看该作者
airwill 发表于 2015-5-7 14:32
用标准库中的 sprintf 就妥了,省时省力?  程序员是省时省力了,但 MCU 很累啊。
这不是 printf() 的底层函 ...

32位也不是这样。
for (; value; )
{
   *ptr++ = (value%10)+'0';
   value /= 10;
}
字符顺序是反的
最后还要把字符串调整一下才行

使用特权

评论回复
7
戈卫东| | 2015-5-7 15:59 | 只看该作者
airwill 发表于 2015-5-7 14:32
用标准库中的 sprintf 就妥了,省时省力?  程序员是省时省力了,但 MCU 很累啊。
这不是 printf() 的底层函 ...

嗯这个其实可以,不过会有前导0

使用特权

评论回复
8
airwill| | 2015-5-8 09:13 | 只看该作者
戈卫东 发表于 2015-5-7 15:50
32位也不是这样。
for (; value; )
{

*ptr++  变成  *ptr-- 顺序不就不反了嘛

使用特权

评论回复
9
戈卫东| | 2015-5-8 10:23 | 只看该作者
airwill 发表于 2015-5-8 09:13
*ptr++  变成  *ptr-- 顺序不就不反了嘛

因为长度开始时不知道的,所以无法确定第一个字符的位置

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

205

帖子

2

粉丝