Как использовать fgets вместе с malloc для создания массива строк? - PullRequest
0 голосов
/ 31 января 2019

Я беру переменное количество строк строки, используя fgets.Конец каждой строки отмечен новой строкой.Я пытаюсь выделить массив строк (используя malloc).Каждый индекс массива будет указывать на каждую строку текста, который вводится пользователем.Это было действительно сложно объяснить, поэтому вот пример:

Используя fgets и malloc, разрешите пользователю вводить несколько строк строк.Пользователь будет сигнализировать конец строк с помощью «.»на новой строке.Каждая строка из нескольких строк будет храниться в виде строки в динамически распределенном массиве.Выходные данные программы должны печатать каждую строку в обратном порядке.

Пример: введите строку: (это ввод сэмпла)

The sky is blue
The grass is green
I love life
.

(это должен быть вывод)

I love life
The grass is green
The sky is blue

Пока у меня есть это:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char charsOnLine[1000];
    char **poem;
    int i;
    int j;


    fgets(charsOnLine, 1000, stdin); //runs only once

    while (charsOnLine[0] != '.')
    {

        poem = malloc(sizeof(char*) * 3);
        for(j = 0; j < strlen(charsOnLine); j++)
        {
            poem[j] = malloc(sizeof(strlen(charsOnLine)));
            strcpy(poem[j], charsOnLine);
        }

        fgets(charsOnLine, 1000, stdin);
    }

    for (j = 0; j < strlen(*poem); j++) //test to print each line of the poem (not in reverse)
    {
        printf("%s\n",poem[j]);
    }
    return 0;
}

Я только что начал с двойных указателей, указателей, динамического выделения памяти, fgets (), и объединение их всех вместе доставляет мне некоторые проблемы.

В моем коде я тестирую, чтобы увидеть, будет ли он печатать каждую строку. Я ввожу так же, как и я, но печатает последнюю введенную строку 4 раза вместо каждой отдельной строки.

Как только я выясню, как печатать каждую введенную строку, я пойму, как напечатать их назад.

Ответы [ 2 ]

0 голосов
/ 31 января 2019
 #include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char charsOnLine[1000];
    char **poem = NULL;
    size_t size = 0, current;


    while (fgets(charsOnLine, 1000, stdin) != NULL && charsOnLine[0] != '.')
    {
        char **tmp;
        tmp = realloc(poem, (size + 1) * sizeof(*poem));
        if(tmp)
        {
            poem = tmp;
            poem[size] = malloc(strlen(charsOnLine) + 1);
            if(poem[size])
            {
                strcpy(poem[size++], charsOnLine);
            }
        }
    }

    current = size;
    while(current--)
    {
        fputs(poem[current], stdout);
    }

    /* do something more with your read poem */

    return 0;
}
0 голосов
/ 31 января 2019

Существует довольно простое решение вашей проблемы «в обратном порядке», которое даже не требует динамического выделения памяти, а просто рекурсии:

void readRecursive() {
     char charsOnLine[1000];
     if (fgets(charsOnLine, 1000, stdin) && charsOnLine[0] != '.') {
        readRecursive();
     }
     fputs(charsOnLine, stdout);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...