Как перераспределить несколько массивов с помощью fgets () - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь прочитать некоторые входные данные, используя fgets (), но мне нужно сохранить входные данные в динамическом массиве, называемом userNumbers, как мне заставить realloc () работать с fgets ()?Моя программа ломается, когда я пытаюсь прочитать более 8 элементов (т.е. 1,2,3,4,5,6,7,8 работ, но 1,2,3,4,5,6,7,8,9,10не).Другое дело, что я ДОЛЖЕН использовать fgets ().Заранее спасибо.

size_t capacity = 4;
size_t size = 0;
char* userNumbers = (char*)malloc(capacity * sizeof(char));
char** realNumStr = (char**)malloc(capacity * sizeof(char*));
double* realNumDouble = (double*)malloc(capacity * sizeof(double));
double* realNumDoubleFinal = (double*)malloc(capacity * sizeof(double));
double* realNumDoubleMedian = (double*)malloc(capacity * sizeof(double));

if (userNumbers == NULL || realNumDouble == NULL || realNumDoubleFinal == NULL || realNumStr == NULL)
{
    printf("insufficient Memory");
    return EXIT_FAILURE;
}

//User's input
while (fgets(userNumbers, capacity, stream))
{
    size += strlen(userNumbers);

    while (size >= capacity)
    {
        capacity = size * 2;

        char* userNumbers2 = realloc(userNumbers, capacity * sizeof(char)+1);
        char** realNumStr2 = realloc(realNumStr, capacity * sizeof(char*)+1);
        double* realNumDouble2 = realloc(realNumDouble, capacity * sizeof(double));
        double* realNumDoubleFinal2 = realloc(realNumDoubleFinal, capacity * sizeof(double));

        if (userNumbers2 == NULL || realNumDouble2 == NULL || realNumDoubleFinal2 == NULL || realNumStr2 == NULL)
        {
            free(userNumbers);
            free(realNumDouble);
            free(realNumDoubleFinal);
            free(realNumStr);

            printf("insufficient Memory");
            return EXIT_FAILURE;
        }
        userNumbers = userNumbers2;
        realNumStr = realNumStr2;
        realNumDouble = realNumDouble2;
        realNumDoubleFinal = realNumDoubleFinal2;
    }

// ... Код продолжается ...}

// Сгенерирована ошибка: HEAP [rstats.exe]: неверный адрес, указанный для RtlValidateHeap (0000026E15F20000,0000026E15F298F0) stat.exe вызвал точку останова.

точка останова сработала здесь: if (! Has_cctor) _cexit ();

1 Ответ

0 голосов
/ 21 июня 2019

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

char line[100];
char *numbersStr = NULL;
size_t size = 0;

while (fget(line, sizeof(line), stream) {
    size_t linelen = strlen(line);
    char *newNumbersStr = realloc(numbersStr, size + linelen + 1);
    if (!newNumbersStr) {
        free (numbersStr);
        printf("insufficient Memory");
        return EXIT_FAILURE;
    }
    numbersStr = newNumbersStr;
    strcpy(&numbersStr[size], line);
    size += linelen;
}

Этот цикл закончится, когда вы достигнете EOF stream.Затем вы можете проанализировать все числа от numbersStr до numbersArray, которые вы можете увеличить с realloc() в этом цикле.

...