2009-10-02 31 views
5

我正在阅读K&R;到目前为止,我做得很好,但有一些功能itoa(),我不明白。他们在itoa()这里说他们自己将数字逆转。例如10是01(它们反转字符串):我不明白itoa()在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 */ 
    } while ((n /= 10) > 0); /* delete it */ 
    if (sign < 0) 
     s[i++] = '-'; 
    s[i] = '\0'; 
    reverse(s); 
    return; 
} 

我不明白它是如何反转数字的。即使我们只是在做n % 10 + '0'那么它的后面的数字10然后1被删除然后它去0右?或者我不明白它的逻辑?

+4

请使用标点符号并避免运行句子。阅读你的问题是非常困难的。 – 2009-10-02 16:11:22

+0

请注意,此代码不能可靠地转换INT_MIN。 – 2009-10-02 16:29:08

+0

@Jonathan你会推荐什么来解释INT_MIN的可移植性?谢谢! – sigjuice 2009-10-02 21:35:20

回答

12

在do-while循环中,它从后面拉数字(最低有效数字)。所以,如果你有数字-123456789,它会处理9,然后是8,然后是7等等。所以,当它遇到空终止符(第三行到最后一行)时,你应该有“987654321 - “,然后颠倒过来。

2

n % 100n = 10,所以在循环之后,字符串s包含01

致电reverse()修复此问题。

+0

嗯,但我想知道如何从后面拉数字?通过模数运算符? – user182502 2009-10-02 18:54:43

+0

也如果它确实为什么,因为它只是得到余数我做了数学,其余的总是在之后。是数字中的最后一个数字,但我不知道为什么不知道我有点困惑 – user182502 2009-10-02 19:07:35

+0

nvm得到它大声笑是愚蠢的:P – user182502 2009-10-02 20:40:28

0

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

的一种方法是预先确定的长度:

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

但没有FPU(和一些具有非常简单的FPU),其可能比串反转的较重的任务的设备。