位于 do 子句中的 '0' 究竟如何与 itoa 函数配合使用?

  • 本文关键字:itoa 函数 子句 do 位于 究竟 c
  • 更新时间 :
  • 英文 :


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)的调用中。

最新更新