Тест на успешное преобразование из stdin
неверен: scanf()
возвращает количество преобразований, а не количество символов. Вы должны сравнить возвращаемое значение с 1
. Как указано в коде, тест l oop немедленно завершается ошибкой, поэтому strings[0]
не изменяется, код имеет неопределенное поведение, поскольку массив, выделенный malloc
, не инициализирован. Этот массив в начале содержит нулевой указатель (потому что его первые байты равны нулю по совпадению), а printf
печатает (null)
для нулевых указателей, что не гарантируется стандартом C, но иногда является полезным индикатором. .
Кроме того, вы должны указать scanf()
максимальную длину слова для сохранения в целевом массиве: scanf("%1000s", buf)
.
Вы также должны ограничить количество слов, которые вы разорвали на массив указателя и проверка на ошибку выделения памяти.
Наконец, вам нужно al oop для вывода строк в обратном порядке ввода.
Вот модифицированная версия:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 1001
int main() {
char buffer[MAXLEN];
int i, j;
char **strings = malloc(sizeof(char *) * MAXLEN);
if (strings == NULL)
return 1;
for (i = 0; i < MAXLEN && scanf("%1000s", buffer) == 1; i++) {
strings[i] = strdup(buffer);
if (strings[i] == NULL)
return 1;
}
for (j = i; j-- > 0;) {
printf("%s\n", strings[j]);
free(strings[j]);
}
free(strings);
return 0;
}