fgets() e gets() nella programmazione C
introduzione
Conosciamo tutti la funzione scanf()
. È la funzione principale applicabile per ricevere gli input di base dell'utente. Anche se scanf()
funziona alla grande mentre accetta input come numero intero, carattere, float ecc. Certamente rimane indietro mentre accetta input di stringa contenenti spazi bianchi. Diamo un'occhiata a un esempio,
#include<stdio.h>
int main()
{
char string[10];
printf("Enter the string: ");
scanf("%s", string);
printf("\n %s",string);
return 0;
}
Produzione:
Come possiamo osservare dall'esempio precedente. scanf()
interrompe la scansione non appena incontra spazi bianchi o newline. Questo, infatti, rende un po' problematico prendere input di stringhe usando scanf()
. Questo può essere facilmente evitato usando altre funzioni di input come gets()
e fgets()
.
In questo articolo impareremo come applicare entrambe le funzioni e confrontarle fianco a fianco.
funzione gets() in C
gets()
è una funzione predefinita in C che viene utilizzata per leggere una stringa o una riga di testo. E memorizza l'input in una variabile stringa ben definita. La funzione termina la sua sessione di lettura non appena incontra un carattere di nuova riga.
Sintassi:
ottiene (nome variabile);
Il codice fornito di seguito illustra l'uso della funzione gets()
,
#include<stdio.h>
int main()
{
char string[10];
printf("Enter the String: ");
gets(string);
printf("\n%s",string);
return 0;
}
Produzione:
Confronta l'output con quello durante l'utilizzo di scanf()
. Hello World è ora trattato come una singola stringa.
funzione fgets() in C
La libreria C standard ci fornisce anche un'altra funzione, la funzione fgets()
. La funzione legge una riga di testo o una stringa dal file o dalla console specificati. E poi lo memorizza nella rispettiva variabile stringa.
Simile alla funzione gets()
, anche fgets termina la lettura ogni volta che incontra un carattere di nuova riga. Ma inoltre, a differenza di gets()
, la funzione si ferma anche quando viene raggiunto EOF o anche se la lunghezza della stringa supera il limite specificato, n-1.
Sintassi,
fgets(char *str, int n, FILE *stream)
- str - È la variabile in cui verrà memorizzata la stringa
- n - È la lunghezza massima della stringa che deve essere letta
- stream - È il filehandle, da dove deve essere letta la stringa.
Fortunatamente, possiamo entrambi leggere righe di testo da un file o dal flusso di input standard utilizzando la funzione fgets()
. Vediamo come
1. Leggi da un dato file usando fgets()
Per esempio,
#include<stdio.h>
int main()
{
char string[20];
FILE *fp;
fp=fopen("file.txt","r");
fgets(string,20,fp);
printf("The string is: %s",string);
fclose(fp);
return 0;
}
Considera che file.txt contenga la riga JournalDev fgets() example!. In tal caso, l'output del codice precedente sarebbe,
2. Leggi da stdin usando fgets()
#include<stdio.h>
int main()
{
char string[20];
printf("Enter the string: ");
fgets(string,20,stdin); #input from stdin stream
printf("\nThe string is: %s",string);
return 0;
}
Produzione:
Conclusione
Anche se entrambe le funzioni, gets()
e fgets()
possono essere utilizzate per leggere input di stringhe. La più grande differenza tra i due è il fatto che quest'ultimo consente all'utente di specificare la dimensione del buffer. Quindi è altamente raccomandato rispetto alla funzione gets()
.
La funzione gets()
non prevede il caso se l'input è più grande del buffer. Di conseguenza, potrebbe verificarsi un intasamento della memoria. Questa è la parte in cui la funzione fgets()
brilla e fornisce una soluzione definitiva.
Riferimenti
- /community/tutorials/strings-in-c-programming
- https://stackoverflow.com/questions/19748307/use-of-fgets-and-gets