我不懂K& R书中的itoa()

时间:2009-10-02 16:07:01

标签: c kr-c

我正在读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对吗?或者我没有得到它的逻辑?

3 个答案:

答案 0 :(得分:12)

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

因此,当它击中空终止符(第3行到最后一行)时,你会得到“987654321-”,然后反转。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

算法确定从最小到最重要顺序的数字。因为预先不知道将要生成的总位数,所以无法确定正确的位置,因为最低位数将在最后,但“结束”未知。因此,它们按照计算的顺序进行缓冲(反向),然后反转整个字符串以纠正排序。

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

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

但是在没有FPU的设备上(有些设备使用非常简单的FPU)可能比字符串反转更重要。