ANSI C,不使用可变参数函数将整数转换为字符串

4

我目前正在使用一种支持ANSI C的可编程逻辑控制器(PLC),但是它使用自己的GNU编译器版本,它不会编译任何可变参数函数和像itoa这样的函数。因此,使用sprintf等方法将整数转换为字符串不是一个选择。是否有人可以指导我去某个网站查找一个强大、无需sprintf的itoa实现或在这里发布一个合适的算法?谢谢!


4
它不支持 ANSI C。 - KeatsPeeks
1
是的。这确实是与SPC供应商营销部门正在进行的讨论 ;) - Maxwin
1个回答

6

这是来自K&R:

void itoa(int n, char s[])
{
    int i, sign;

    if ((sign = n) < 0)  /* record sign */
        n = -n;          /* make n positive */
    i = 0;
    do {       /* generate digits in reverse order */
        s[i++] = n % 10 + '0';   /* get next digit */
    } while ((n /= 10) > 0);     /* delete it */
    if (sign < 0)
        s[i++] = '-';
    s[i] = '\0';
    reverse(s);
} 

reverse() 只是将字符串反转。


请小心使用此版本,因为它可能会溢出缓冲区。 - R Samuel Klatchko
1
是的,这是真的。调用者必须知道缓冲区是否有足够的空间,就像sprintf()一样。 - Alok Singhal
这就是为什么你永远不应该使用sprintf(),而只应该使用snprintf()的原因。 - R Samuel Klatchko
2
我同意你的观点,如果你把“never”换成“almost never”的话。一般来说,应该优先选择snprintf()。但是如果确信目标缓冲区具有所需的大小,则sprintf()也可以使用。请参见http://stackoverflow.com/questions/1996374/convert-integer-into-an-array/1996500#1996500作为例子。 - Alok Singhal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接