#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 назначений инициализации, значения вместо нулей являются неопределенными, поэтому они содержат случайные (произвольные) значения.