ANSI C,不带可变函数的整数到字符串

ANSI C,不带可变函数的整数到字符串,c,string,integer,itoa,C,String,Integer,Itoa,我目前正在使用一个支持ANSIC的PLC,但是使用它自己的GNU编译器风格,它不编译任何可变函数和类似itoa的东西。因此,使用sprintf&co.不是将整数转换为字符串的选项。有谁能告诉我一个网站,上面列出了一个健壮的、没有sprintf的itoa实现,或者在这里发布了一个合适的算法?提前感谢。这是K&R的: void itoa(int n, char s[]) { int i, sign; if ((sign = n) < 0) /* record sign */

我目前正在使用一个支持ANSIC的PLC,但是使用它自己的GNU编译器风格,它不编译任何可变函数和类似itoa的东西。因此,使用sprintf&co.不是将整数转换为字符串的选项。有谁能告诉我一个网站,上面列出了一个健壮的、没有sprintf的itoa实现,或者在这里发布了一个合适的算法?提前感谢。

这是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);
} 
void itoa(int n,char s[])
{
int i,符号;
如果((符号=n)<0)/*记录符号*/
n=-n;/*使n为正*/
i=0;
{/*是否按相反顺序生成数字*/
s[i++]=n%10+'0';/*获取下一个数字*/
}而((n/=10)>0);/*删除它*/
if(符号<0)
s[i++]='-';
s[i]='\0';
反面;
} 

reverse()
只是反转字符串。

因此它不支持ANSI C。是的。这确实是与SPC供应商营销部门正在进行的讨论;)小心使用这个版本,因为它会使缓冲区溢出。是的,确实如此。调用者必须知道缓冲区是否有足够的空间。就像
sprintf()
。这就是为什么你永远不应该使用
sprintf()
,而只应该使用
snprintf()
我同意你的看法,如果你用“几乎从不”代替“从不”。一般来说,人们应该更喜欢
snprintf()
。但是如果确定目标缓冲区具有所需的大小,
sprintf()
也可以。例如,见。