《C编程语言手册》(K+R)中列出了itoa函数,如下所示:
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] = '\0';
reverse(s);
}
当我去掉“+ '0‘”时,我得到了一个“分割错误= 11”的错误,如果我错了,请纠正我,这是在你超出界限时发生的。我在试着更好地理解这里发生了什么。谢谢
发布于 2019-12-28 05:09:52
itoa()
将数字转换为字符串,因此每个数字都必须从范围0-9
中的值转换为范围’0’-‘9’
中的字符。因为字符恰好按顺序出现在ASCII码中,所以可以通过将数字的值与最低字符’0’
的值相加来实现这一点。
我不确定分段错误,但如果没有‘+’0,你可能会遇到一个问题,那就是当你转换的数字中出现零的时候,你的字符串将会有一个零字节,这使得字符串看起来比实际的要短。
发布于 2019-12-28 05:12:45
'0'
是ASCII表中数字的基值。ASCII字符"0“的十进制值为48。为了计算整数0-9的正确ASCII码字符,您可以添加'0' + n
,其中n
是十进制值。要查看实际效果,请将代码中的'0'
替换为48
。得到的字符串将是相同的。
这之所以有效,是因为C中的char
数据类型只是一个小整数(单字节),而'0'
是char
值48的语法糖。
发布于 2019-12-28 05:15:09
ascii字符'0'
代码是十进制的48
。每当n % 10
返回0
(对于任何是0
的数字都会发生这种情况),那么您实际上是在向s中注入一个空字节。
我的猜测是分段错误实际上发生在reverse(s)
的调用中。
https://stackoverflow.com/questions/59508268
复制