itoa 函数在 C 编程语言手册 (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 */ ***THIS IS WHERE THE "+ '0'" OCCURS***
} while ((n /= 10) > 0); /* delete it */
if (sign < 0)
s[i++] = '-';
s[i] = ' ';
reverse(s);
}
当我取出" + '0'"时,我得到一个"分段错误= 11"错误,如果我错了,请纠正我,当你越界时发生。我试图更好地了解这里发生的事情。谢谢
itoa()
将数字转换为字符串,因此每个数字都必须从范围内的值转换为’0’-‘9’
范围内的字符0-9
。由于字符恰好按 ASCII 中的顺序显示,因此您可以通过将数字的值添加到最低字符的值’0’
来实现。
我不确定分段错误,但是如果没有"+'0",您可能会遇到的一个问题是,只要您正在转换的数字中出现零,您的字符串就会有一个零字节,从而使字符串看起来比实际更短。
'0'
是 ASCII 表中数字的基值。ASCII 字符"0"的十进制值为 48。为了计算整数 0-9 的正确 ASCII 字符,您可以添加'0' + n
,其中n
是十进制值。若要查看此操作的实际效果,请将代码中的'0'
替换为48
。生成的字符串将相同。
这是有效的,因为 C 中的char
数据类型只是一个小整数(单个字节(,而'0'
是char
值 48 的语法糖。
ascii char'0'
代码以十进制48
。 每当n % 10
返回0
(对于任何0
的数字都会发生这种情况(,那么您实际上是在将空字节注入 s。
我的猜测是分段错误实际上发生在reverse(s)
的调用中。