Пытаясь понять функцию Итоа - PullRequest
0 голосов
/ 05 июля 2018

Я пытался переписать функцию itoa() из упражнений K & R, но мне не удалось ее определить. Я вижу ответ функции в библиотеке, но не могу понять, что находится внутри блока 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 голосов
/ 05 июля 2018

s[i++] = n % 10 + '0'; Средства:

  1. s[i++] означает номер символа i в массиве символов s и увеличение i на 1
  2. n % 10 означает, что вы берете только последнюю цифру, например, в 123, 123 % 10 возвращает 3, что является цифрой, это делается для разрезания вашего номера на цифры , так Вы можете создать символ с каждым из них.
  3. + '0' означает, что вы добавляете значение ascii для символа '0', например, int 1 + '0' возвращает символ '1', чтобы вы могли получить массив символов.
  4. n /= 10 означает, что мы удаляем последнюю цифру , действительно, мы добавили ее в наш массив символов, чтобы мы могли удалить ее, например, 123 / 10 = 12, тогда вы можете сделать 12 % 10, чтобы получить вторая цифра: 2

Это дает нам массив символов, инвертированный, например, для 123 мы получили массив вроде {'3', '2', '1'}, поэтому в конце мы вызываем reverse s, чтобы (thx captain очевидно) полностью изменили наш char массив

Для отрицательного n вы можете просто добавить '-' к вашему массиву символов и умножить n на -1, чтобы оно стало положительным, и вы можете выполнять свою работу как всегда:)

Надеюсь, это поможет вам:)

0 голосов
/ 05 июля 2018

Для неотрицательных n:

n /= 10 удаляет наименее значимую цифру из целочисленного типа. Это сокращение для n = n / 10, а любой остаток от n / 10 отбрасывается.

n % 10 извлекает младшую значащую цифру из n, а добавление к '0' дает вам текстурный эквивалент этого числа. (Обратите внимание, что этот идиоматический метод работает для любого символа , кодирующего , поддерживаемого C.)

...