我正在读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对吗?或者我没有得到它的逻辑?
答案 0 :(得分:12)
在do-while循环中,它从后面拉出数字(最低有效数字首先)。所以,如果你有数字-123456789,它会处理9,然后是8,然后是7,等等。
因此,当它击中空终止符(第3行到最后一行)时,你会得到“987654321-”,然后反转。
答案 1 :(得分:2)
n % 10
为0
提供了n = 10
,因此在循环之后,字符串s
包含01
。
对reverse()
的调用解决了这个问题。
答案 2 :(得分:0)
算法确定从最小到最重要顺序的数字。因为预先不知道将要生成的总位数,所以无法确定正确的位置,因为最低位数将在最后,但“结束”未知。因此,它们按照计算的顺序进行缓冲(反向),然后反转整个字符串以纠正排序。
避免这种情况的一种方法是提前确定长度:
decimal_digits = (int)log10( n ) + 1 ;
但是在没有FPU的设备上(有些设备使用非常简单的FPU)可能比字符串反转更重要。