Токенизация строки из массива Dynami c в несколько строк в массиве STATI c 2D - PullRequest
0 голосов
/ 22 марта 2020

У меня есть динамический c массив, который содержит строку, содержащую символы \ n, поэтому эта строка состоит из нескольких строк. Я пытаюсь извлечь строки и поместить их все в массив двумерных символов, и я получаю ошибки сегментации.

Вот мой код:

    char *input_lines = malloc(MAX_LINE_LEN*sizeof(char)); 
    input_lines = extractInput(MAX_LINE_LEN, input_file);
    char inputLines_counted[lineCount_input][MAX_LINE_LEN];


    char *t = strtok(input_lines, "\n");
    for(i = 0; i < lineCount_input; i++) {
        strcpy(inputLines_counted[i], t);
        // printf("%s\n", inputLines_counted[i]);
        t = strtok(NULL, "\n");
    }

После создания динамического элемента c массив, я использую функцию extractInput(MAX_LINE_LEN, input_file), чтобы заполнить массив input_lines строкой, содержащей несколько строк.

Вот функция извлечения:

char *extractInput(int len, FILE *file) {
    char tmp[len];
    char *pos;
    char *input_lines = malloc(len*sizeof(char)); 
    char *lines;
    while(fgets(tmp, len, file)) {
        // if((pos = strchr(tmp, '\n')) != NULL) {
        //     *pos = ' ';
        // }
        input_lines = realloc(input_lines, (strlen(input_lines) + len)*sizeof(char));
        strcat(input_lines, tmp);
    }
    return input_lines;
}

Почему я получаю ошибки здесь

1 Ответ

0 голосов
/ 22 марта 2020

Вызов функции

    input_lines = realloc(input_lines, (strlen(input_lines) + len)*sizeof(char));

берет текущий выделенный блок памяти и расширяет его, если может. Вы должны проверить возвращаемое значение reallo c, оно может завершиться ошибкой.

Кстати, когда вы выделяете память в C, вам всегда нужно место для окончания \ 0.

посмотрим, что произойдет с этим файлом

hello\n
world\n

Первый fgets читает привет \ n в tmp.

теперь вы делаете reallo c, хотя это и не нужно, input_lines уже указывает на буфер, который может содержать строку

char *input_lines = malloc(MAX_LINE_LEN*sizeof(char)); 

теперь с вашим reallo c

input_lines = realloc(input_lines, (strlen(input_lines) + len)*sizeof(char));

вы делаете strlen (input_lines) + len, поэтому вы делаете буфер strlen ("hello \" n ") + длина long.

, но важно отметить следующее:

strcat(input_lines, tmp);

у вас нет инициализированной памяти, на которую указывает input_lines to, он может содержать все, даже \ 0, так что ваш strcat потенциально может поместить строку в любом месте буфера и вызвать ошибку, которую вы описываете.

Либо выполните memset, либо используйте callo c при выделении буфера.

Если вы используете reallo c, вы должны ld отслеживает общий размер, который вы выделили, и то, сколько вы его используете, прежде чем копировать в буфер, проверьте, достаточно ли места. Если нет, добавьте определенное количество байтов в буфер.

Я также заметил, что вы читаете из файла строку за строкой, затем соединяете строки вместе, чтобы позже использовать strtok для их разделения. Было бы эффективнее вернуть массив строк.

...