2010-01-04 22 views
13

So che tutti mi hanno detto di usare fgets e non ottenerlo a causa dell'overflow del buffer. Tuttavia, sono un po 'confuso riguardo il terzo parametro in fgets(). A quanto ho capito, fgets dipende da:Funzione fgets() in C

char * fgets (char * str, int num, FILE * stream); 

char* str è il PTR a cui verrà memorizzato il mio ingresso.

num è il numero massimo di caratteri da leggere.

ma che cos'è FILE *stream? Se sto solo chiedendo all'utente di inserire una stringa (come una frase) dovrei semplicemente digitare "stdin"?

E dovrei digitare FILE *stdin nella parte superiore, vicino a main()?

risposta

14

Sei corretto. stream è un puntatore a una struttura FILE, come quella restituita da fopen. stdin, stdout e stderr sono già definiti per il programma in uso, quindi è possibile utilizzarli direttamente anziché aprirli o dichiararli autonomamente.

Ad esempio, è possibile leggere dallo standard input con:

fgets(buffer, 10, stdin); 

o da un file specifico con:

FILE *f = fopen("filename.txt", "r"); 
fgets(buffer, 10, f); 
+1

penso che il secondo parametro dovrebbe essere strlen (buffer) -1. A meno che il tuo buffer non sia un 11 byte. – ant2009

+0

@robUK, che funzionerebbe solo se il buffer non erano tutti zeri per cominciare. Come menzionato dall'OP, i buffer overflow non sono realmente la preoccupazione della domanda. –

1

file è il file standard C. Sì, se si desidera leggere dallo standard input, stdin è il simbolo corretto.

1

Sì, dovresti semplicemente usare stdin. Questo è un valore predefinito FILE * che legge dallo standard input del tuo programma. E dovrebbe già essere definito se si dispone di un #include <stdio.h> nella parte superiore del file (che è necessario per fgets).

1

In linea di massima ci sono due modi per comunicare con i file in C. Uno sta usando il sistema operativo di basso livello chiama dipendente dal sistema, come open(), read(), write() ecc, che lavorano con i descrittori di file. Un altro usa le strutture FILE che sono usate nelle funzioni di libreria C come fread(), fwrite() ecc. Incluso quello che hai menzionato sopra.

Come per la filosofia UNIX, tutto è un file. Pertanto, anche lo standard input (stdin) viene considerato come un puntatore a una struttura FILE.

tl; dr Sì, è necessario utilizzare stdin per FILE* stream nella chiamata a fgets()