Есть ли в си аналог 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 создает динамический массив, где хранится токен.