试图理解 itoa 函数

Trying to understand itoa function

我尝试重写 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] = '[=10=]';
     reverse(s);
 }

对于非负值n

n /= 10 从整数类型中删除最低有效位。它是 n = n / 10 的 shorthand,n / 10 的任何余数都将被丢弃。

n % 10n 中提取最低有效数字,并将其添加到 '0' 得到该数字的结构等价物。 (请注意,这种惯用技术适用于 C 支持的任何字符 encoding。)

s[i++] = n % 10 + '0'; 表示:

  1. s[i++] 表示字符数组 s 中的字符编号 i 并将 i 递增 1
  2. n % 10表示只取最后一位,比如在123123 % 10、returns、3中就是一个数字,这是将您的号码切成数字,这样您就可以用每个数字创建一个字符。
  3. + '0'的意思是把字符'0'的ascii值加上,比如int 1 + '0'returns字符'1'这样就可以得到一个字符数组。
  4. n /= 10 表示 我们删除了最后一位 ,实际上,我们将它添加到我们的 char 数组中以便我们可以删除它,例如 123 / 10 = 12然后你可以做 12 % 10 得到第二个数字:2

这给了我们一个反转的 char 数组,例如,对于 123,我们得到了一个像 {'3', '2', '1'} 这样的数组,所以最后我们调用 reverse s 到 (thx captain obvious) reverse我们的字符数组

对于负数 n 你可以只添加一个 '-' 到你的 char 数组并将你的 n 乘以 -1 所以它变成正数,你可以做你的一如既往的工作:)

希望对你有帮助:)