Originariamente inviata da
SEGFAULT
Il problema è che la fgets() scrive la stringa che viene presa in input nel buffer. Per forza di cose devi "dirgli" una dimensione massima entro la quale non si sfora la lunghezza del buffer.
L' alternativa sarebbe quella di leggere la stringa carattere per carattere con la getchar(), allocando un carattere alla volta (oppure raddoppiando la dimensione del buffer ogni volta che serve più spazio), però se chiami troppe volte la realloc() può essere inefficiente.
In realtà puoi benissimo usare fgets alla base:
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 128
static int cpy(char **line, size_t *n, int l, char *BUFFER, int tmp_l) {
if(((*n)-l) < (tmp_l+1)) {
*n = l+tmp_l+1;
char *tmp = (char *)realloc(*line, sizeof(char)*(*n));
if(tmp == NULL) {
return -2;
}
*line = tmp;
}
strcpy((*line)+l, BUFFER);
return 0;
}
int get_line(char **line, size_t *n, FILE *f) {
char BUFFER[N];
int l = 0, tmp_l;
while(1) {
if(fgets(BUFFER, N, f) == NULL) {
return -1;
}
tmp_l = strlen(BUFFER);
if(BUFFER[tmp_l-1] == '\n') {
BUFFER[--tmp_l] = '\0';
break;
}
if(feof(f)) {
break;
}
if(cpy(line, n, l, BUFFER, tmp_l)) {
return -2;
}
l += tmp_l;
}
if(cpy(line, n, l, BUFFER, tmp_l)) {
return -2;
}
return l+tmp_l;
}
int main(void) {
char *l = NULL;
size_t n = 0;
while(get_line(&l, &n, stdin) >= 0) {
printf("%s", l);
}
return 0;
}
A parte che se stai usando un compilatore tipo gcc puoi usare getline (funzione di libreria, che non è pienamente compatibile con la funzione presentata sopra).
Edit 15:47 corretto errore di svista: BUFFER[--tmp_l] == '\0'; -> BUFFER[--tmp_l] = '\0';