Пример кода K

#c #arrays

#c #массивы

Вопрос:

В главе 1.6 K amp; R приведен пример кода для подсчета цифр, пробелов и других символов. Далее следует их код плюс возвращаемая строка 0.

 int c, i, nwhite, nother;
int ndigit[10];

nwhite = nother = 0;
for (i = 0; i < 10;   i);
    ndigit[i] = 0;

while ((c = getchar()) != EOF)
    if ( c >= '0' amp;amp; c <= '9')
          ndigit[c - '0'];
    else if (c == ' ' || c == 't' || c == 'n')
          nwhite;
    else
          nother;

printf("digits=");
for (i = 0; i < 10;   i)
    printf(" %d", ndigit[i]);
printf(", white space = %d, other =%dn",
    nwhite, nother);

return 0;
  

Когда я запускаю это, независимо от входных данных, я получаю длинную строку целых чисел (1-7 цифр, некоторые положительные, некоторые отрицательные, все согласуются независимо от входных данных) для того, какими должны быть значения 0-9. Процесс действительно возвращает 0.

(Скопировал бы и вставил пример, но у меня также возникли проблемы с тем, чтобы заставить это работать в cmd, несмотря на следование этим инструкциям о том, как включить Ctrl C / Ctrl V для вставки в командной строке Windows.)

Что не так?

Комментарии:

1. У вас есть лишнее ; , которое все портит.

2. Поскольку первый цикл for (i = 0; i < 10; i); заканчивается на ; , массив ndigit инициализирован неправильно. Чтобы это не пропало, используйте { ... } для обозначения кода условного блока.

Ответ №1:

Посмотрите на эту часть вашего кода:

 for (i = 0; i < 10;   i);
    ndigit[i] = 0;
  

Он делает то же самое, что и этот (я только разделяю первую строку на две строки и удаляю вторую строку):

 for (i = 0; i < 10;   i)
    ;

ndigit[i] = 0;
  

Таким образом, for цикл имеет пустое тело — он только увеличивает переменную i до точки, когда она достигает значения 10 .

Итак, следующая команда

 ndigit[i] = 0;
  

делает ли это:

 ndigit[10] = 0;
  

и это полностью отличается от вашего намерения — вы хотели выполнить это:

 ndigit[0] = 0;
ndigit[1] = 0;
ndigit[2] = 0;
.
.
ndigit[9] = 0;
  

Поскольку вы не выполнили эти 10 назначений инициализации, значения вместо нулей являются неопределенными, поэтому они содержат случайные (произвольные) значения.