Есть ли в си аналог getline, но с чтением в уже объявленную строку определенной длины?

Есть ли в си аналог getline, но с чтением в уже объявленную строку определенной длины? У меня проблема, при многократном чтении с помощью getline при абсолютно одинаковых словиях при удалении массива в цикле возникает ошибка двойного удаления с помощью free. Я хочу избежать ее, или создавай динамический массив определенной длины 1 раз и перезаписывая в него данные или создать статический массив определенной длины... Чтение пробелов и табуляций необходимо.

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

#include "parser.h"
#define MAX_TOCKENS 4
#define NUMBER_OF_SITUATIONS 3
#define VOID_STRING "...       "


typedef void (*heandler)(char** buf, struct Data* data);
void Print(struct Data* buffer);

int main()
{
    const char* filename = "/home/anton/Programming/assembler/test3";
    FILE* file = fopen(filename, "r");
    if (file == NULL)
        return -1;
    char* string = NULL;
    int lenght = 0;
    size_t size = 0;
    char* tockens[MAX_TOCKENS];
    //создаем буфе, в котором будут храниться поля
    struct Data buffer;
    //создаем массив указателей на функцию
    heandler situations[NUMBER_OF_SITUATIONS];
    // в массив указателей на функцию, присваиваем функции, обрабатывающие ситуацию с 1, 2 и 3 токкенами
    situations[0] = SingleTockenParsing;
    situations[1] = TwoTockenParsing;
    situations[2] = ThreeTockenParsing;
    while ((lenght = getline(&string, &size, file)) > 0) {
        string[lenght - 1] = '\0'; // избавление от символа переноса строки (\n)
        DataInit(&buffer); // инициализация структуры Data значениями NULL
        ssize_t point = 0;
        buffer.comment = GetComment(string, '/', &point); // ищем комментарий в  строке, если находим отделяем его от остальной строки с помощью символа \0
        if (buffer.comment != NULL)
            string[point] = '\0';
        tockens[0] = GetTocken(string, VOID_UNSKIP); // вытаскиваем первый токкен из строки
        if (tockens[0] != NULL){
            ssize_t count = 1;
            while ((tockens[count] = GetTocken(NULL, VOID_SKIP)) != NULL){ //вытаскиваем оставшиеся токкены
                //проверяем регистр взятого токкена, если регистр не нижний удаляем взятый токкен и на его место вставляем null
                if (CheckRegister(tockens[count]) == LOW)
                    count++;
                else{
                    free(tockens[count]);
                    tockens[count] = NULL;
                }
            }
            free(string);
            situations[count- 1](tockens, &buffer);
        }
        Print(&buffer);
        for (ssize_t i = 0; tockens[i] != NULL; i++)
            free(tockens[i]);
        free(buffer.comment);

    }
    fclose(file);
    return 0;
}

функция GetTocken создает динамический массив, где хранится токен.


Ответы (0 шт):