【问题标题】:I don't understand itoa() in K&R book我不明白 K&R 书中的 itoa()
【发布时间】:2009-10-02 16:07:01
【问题描述】:

我正在阅读 K&R;到目前为止,我做得很好,但函数itoa() 中有一些我不明白的东西。在itoa() 中,他们说他们自己颠倒了数字。例如 10 是 01(他们反转字符串):

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);
    return;
}

我不明白它是如何颠倒数字的。即使我们只是在做n % 10 + '0' 那么它的下一个数字 10 然后 1 被删除然后它变成 0 对吗?还是我不明白它的逻辑?

【问题讨论】:

  • 请使用标点符号,避免重复句子。阅读您的问题非常困难。
  • 请注意,此代码不能可靠地转换 INT_MIN。
  • @Jonathan 您建议如何以便携方式解释 INT_MIN?谢谢!

标签: c kr-c


【解决方案1】:

在 do-while 循环中,它从后面拉出数字(最低有效位在前)。所以,如果你有数字 -123456789,它会处理 9,然后是 8,然后是 7,等等。

因此,当它到达空终止符(倒数第三行)时,您将得到“987654321-”,然后将其反转。

【讨论】:

    【解决方案2】:

    n % 10n = 10 提供0,因此在循环之后,字符串s 包含01

    调用reverse() 解决了这个问题。

    【讨论】:

    • yh 但我想知道它是如何从后面拉数字的?通过模运算符?
    • 如果它确实如此,为什么因为它只是得到余数,所以我做了数学计算,余数总是在 .是数字中的最后一个数字,但我不知道为什么我有些困惑
    【解决方案3】:

    该算法从最低到最高有效顺序确定数字。因为预先不知道将生成的总位数,所以在生成它们时无法确定正确的位置 - 最低有效位将在末尾,但不知道“末尾”。因此它们按照计算的顺序进行缓冲(反转),然后将整个字符串反转以更正顺序。

    避免这种情况的一种方法是提前确定长度:

    decimal_digits = (int)log10( n ) + 1 ;
    

    但在没有 FPU 的设备(以及一些具有非常简单的 FPU)的设备上,这可能是比字符串反转更重的任务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      • 2013-12-03
      • 1970-01-01
      相关资源
      最近更新 更多