我尝试通过K&R练习重新编写itoa()
函数,但是未能定义它。我在库中看到了该函数的答案,但是我不明白do块中的内容。请给我解释一下。谢谢!
/* itoa: convert n to characters in s */
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);
}
答案 0 :(得分:5)
s[i++] = n % 10 + '0';
意思是:
s[i++]
表示字符数组i
中的字符数s
,并将i
递增1 n % 10
表示您只接受最后一位数字,例如123
,123 % 10
返回3
这是一个数字,这是为了完成 cut您的电话号码变成数字,以便您可以使用每个数字创建一个字符。+ '0'
意味着您添加了字符'0'
的ascii值,例如int 1 + '0'
返回了字符'1'
,因此您可以获得一个字符数组。n /= 10
表示我们删除了最后一位数字,的确,我们将其添加到了char数组中,以便我们可以删除它,例如123 / 10 = 12
然后您可以{ {1}}得到第二个数字:2 这为我们提供了一个反转的char数组,例如对于123,我们得到了一个类似{'3','2','1'}的数组,因此最后我们将reverse s称为(thx队长很明显)反转char数组
对于负数12 % 10
,您可以将一个n
添加到char数组中,然后将'-'
乘以n
,使其变为正数,您就可以像总是:)
希望它对您有帮助:)
答案 1 :(得分:3)
对于非负n
:
n /= 10
从整数类型中删除最低有效位。它是n = n / 10
的简写,并且n / 10
中的所有余数都将被丢弃。
n % 10
从n
中提取最低有效数字,并将其添加到'0'
中可得到该数字的等效结构。 (请注意,这种惯用技术适用于C支持的任何字符 encoding 。)