печать строк в массиве строк в обратном порядке - PullRequest
0 голосов
/ 05 мая 2020

Итак, я создал эту программу, цель которой - сохранить строку из стандартного ввода и сохранить в массиве строк. После этого я хочу напечатать все строки, хранящиеся в массиве, но в обратном порядке.

Пример:

Вход:

abc def hij klm nop

Выход:

nop
klm
hij
def
abc

Программа:

#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#define MAXLEN 1001

int main(){
    char buffer[MAXLEN];
    char** strings;
    int i = 0;
    int j = MAXLEN;
    strings = (char**)malloc(sizeof(char*)*MAXLEN);
    while(scanf("%s",buffer) == 3)
    {
        strings[i]=(char*)malloc(sizeof(char)*(strlen(buffer)+1));
        strcpy(strings[i],buffer);
        i++;
    }
    printf("%s",strings[0]);
}

Ну, я просто поместил 1-ю строку только для того, чтобы проверить, печатает ли она какие-либо строки, проблема в том, что если ввести это в примере, он печатает (null) вместо это слово, и мне интересно, почему оно указывает на NULL, а не на строку, которую я дал.

На самом деле любая помощь будет оценена.

1 Ответ

1 голос
/ 05 мая 2020

Тест на успешное преобразование из 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...