вы делаете line[n++] = tmp
. И затем доступ к line[n]
после этого. Но line[n]
не было назначено.
Чтобы изменить его, вы можете напечатать line[n-1]
вместо этого, но более понятным будет:
line[n] = tmp;
i = 0;
printf(... line[n]);
и вместо этого поместите приращение в оператор for, т.е. for (n = 0; c != EOF; n++)
.
EDIT
Это краткое изложение того, что я бы сделал:
Поместите назначение i=0
в начало цикла. Логически это инициализация i
, и в настоящее время она выполняется в двух местах (в int i = 0;
и после присвоения line[n]
). Оба места не находятся рядом с тем местом, где можно ожидать инициализации переменной, используемой в цикле while
.
Защитите от бессмысленного ввода, проверив, что i
не превышает WORDLENGTH-1
. На самом деле, я бы, вероятно, закодировал внутренний цикл while
как цикл for
, вот так:
for (i = 0; i < WORDLENGTH; i++) {
tmp[i] = getchar();
if (tmp[i] == ' ') break;
}
tmp[i] = 0;
или (в моем характере) for(i = 0; i < WORDLENGTH; ++i) if ((tmp[i] = getchar()) == ' ') break;
с последующим ..
tmp[i] = 0
для NUL-конца строки. Поскольку malloc
не обязательно возвращает заполненный 0 блок памяти.