PDA

Visualizza la versione completa : [C] Dubbi di teoria su fgets


wFree
08-01-2014, 11:13
Salve a tutti!

Sulle slide datemi dal mio prof c'è scritto:

char* fgets(char* <s>,int <n>,FILE* <file>);
- Legge una stringa dal file fermandosi al più dopo n-1 caratteri
- L’eventuale ‘\n’ NON viene eliminato (diverso da gets !)
- Restituisce il puntatore alla stringa letta o NULL in caso di fine file
o errore

La frase in grassetto significa che fgets immagazzina in un vettore questo: "stringa\n\0"?
Grazie

vbextreme
08-01-2014, 11:29
si esatto,per rimuoverlo basta:



char input[80];

fgets(input,80,stdin);
input[strlen(input)-1] = '\0';


o nella forma piu compatta:



char input[80];

fgets(input,80,stdin)[strlen(input)-1] = '\0';

wFree
08-01-2014, 11:41
Grazie :)
E perdona la mia ignoranza ma così facendo passo da "stringa\n\0" a "stringa\0\0"
Va bene? Non crea problemi?

oregon
08-01-2014, 12:31
Non crea problemi ma attenzione al caso in cui la stringa è completamente utilizzata. In quel caso il carattere '\n' in più non viene memorizzato.

Quindi il codice va modificato così



int ilen = strlen(input)-1;
if(input[ilen]=='\n') input[ilen]='\0';

wFree
08-01-2014, 13:22
Grande, è perfetto così
Ancora grazie :o

MItaly
08-01-2014, 13:25
Attenzione/bis: se non viene acquisito alcun dato da tastiera (ad esempio se l'utente preme Ctrl-D) si può avere una stringa di lunghezza zero, per cui strlen(input)-1 sfora dall'array (in negativo). Per cui per essere davvero sicuri bisognerà fare:


size_t len=strlen(input);
if(len!=0 && input[len-1]=='\n')
input[len-1]=0;

wFree
08-01-2014, 13:33
Chiaro, così è ancora meglio! Grazie a tutti :)

vbextreme
08-01-2014, 13:34
giornata di pignoletto? :D
anche perchè a questo punto è meglio riscrivere la fgets.....eheheheheheh

vbextreme
08-01-2014, 13:39
char* mgets(char* d,int sz,FILE* f)
{
char* st = d;
for(; (*d = getc(f)) != EOF && *d != '\n' && sz-- > 0 ; d++);
*d = '\0';
return st;
}

Loading