Ja bym użył stałych i ograniczył długość linii do iluś bajtów/ znaków, żeby psikus w pliku nie zrobił bałaganu. Jeśli linia okaże się zbyt długa, najlepiej wywalić użytkownikowi komunikat, że linia jest za długa.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
static const size_t MAX_VALUE_SIZE = 1000;
static const size_t MAX_LINE_SIZE = UINT_MAX - 100;//przykładowa duża wartość
int main() {
const char* const buffer = "smerf=maruda";//powiedzmy, że tu jest jakieś sprawdzenie długości linii i jej wczytanie
char key[MAX_VALUE_SIZE];
char value[MAX_VALUE_SIZE];
memset(key, 0, MAX_VALUE_SIZE);
memset(value, 0, MAX_VALUE_SIZE);
if (MAX_LINE_SIZE < strlen(buffer)) {
printf("Line to long!\n");
return 1;
}
if (sscanf(buffer,"%[^=]=%150c", key, value) == 2) {
if (strcmp("smerf", key) == 0) {
const size_t length = strlen(value) + 1;
char* dupa = NULL;
if (length >= MAX_VALUE_SIZE) {
printf("String to long!\n");
return 2;
}
dupa = malloc(length * sizeof(char));
strcpy(dupa, value);
printf("%s\n\n", dupa);
} else {
printf("dupa\n");
}
}
//tutaj można po sobie posprzątać
return 0;
}
Tutaj nie weryfikowałem jeszcze czy strlen
się nie wywali, bo długość linii powinna być sprawdzona przed jej wczytaniem. Teraz taki kod kompiluje się bez problemu poleceniem
gcc -Wall --pedantic -Wextra dupa.c