ANSI C,不带可变函数的整数到字符串
我目前正在使用一个支持ANSIC的PLC,但是使用它自己的GNU编译器风格,它不编译任何可变函数和类似itoa的东西。因此,使用sprintf&co.不是将整数转换为字符串的选项。有谁能告诉我一个网站,上面列出了一个健壮的、没有sprintf的itoa实现,或者在这里发布了一个合适的算法?提前感谢。这是K&R的: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 */
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()
也可以。例如,见。