试图了解itoa功能

时间:2018-07-05 11:29:49

标签: c do-loops itoa

我尝试通过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);
 }

2 个答案:

答案 0 :(得分:5)

s[i++] = n % 10 + '0';意思是:

  1. s[i++]表示字符数组i中的字符数s,并将i递增1
  2. n % 10表示您只接受最后一位数字,例如123123 % 10返回3这是一个数字,这是为了完成 cut您的电话号码变成数字,以便您可以使用每个数字创建一个字符。
  3. + '0'意味着您添加了字符'0'的ascii值,例如int 1 + '0'返回了字符'1',因此您可以获得一个字符数组。
  4. 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 % 10n中提取最低有效数字,并将其添加到'0'中可得到该数字的等效结构。 (请注意,这种惯用技术适用于C支持的任何字符 encoding 。)