fgets() e gets() nella programmazione in C

Tutti siamo familiari con la funzione scanf(). È la principale funzione applicabile per prendere input utente di base. Anche se scanf() funziona bene quando si prendono input come intero, carattere, float ecc. Certamente si dimostra insufficiente quando si prendono input di stringhe 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;
}

Output:

Problem With scanf()

Come possiamo osservare dall’esempio sopra. scanf() si interrompe non appena incontra spazio bianco o una nuova riga. 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 una accanto all’altra.

Funzione gets() in C

gets() è una funzione predefinita in C che viene utilizzata per leggere una stringa o una linea 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:

gets( 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;
}

Output:

Use Of Gets

Confronta l’output con quello ottenuto usando scanf(). ‘Hello World’ viene ora trattato come una sola stringa.

Funzione fgets() in C

La libreria standard C ci fornisce anche un’altra funzione, la fgets(). La funzione legge una riga di testo o una stringa dal file specificato o dalla console. E poi la memorizza nella rispettiva variabile stringa.

Similmente alla funzione gets(), fgets interrompe la lettura quando 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 la stringa verrà memorizzata
  • n – It is the maximum length of the string that should be read
  • stream – È l’handle del file, da cui la stringa deve essere letta.

Fortunatamente, possiamo leggere sia le righe di testo da un file che lo stream di input standard utilizzando la funzione fgets(). Vediamo come

1. Leggi da un file dato 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 il file file.txt contenente la linea ‘JournalDev fgets() example!’. In tal caso, l’output del codice precedente sarebbe,

fgets() file input

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;
}

Output:

fgets() Stdin Input

Conclusioni

Anche se entrambe le funzioni, gets() e fgets(), possono essere utilizzate per leggere input di stringhe. La differenza più grande tra le due è il fatto che quest’ultima consente all’utente di specificare la dimensione del buffer. Pertanto, è altamente consigliata rispetto alla funzione gets().

La funzione gets() non prevede il caso in cui l’input sia più grande del buffer. Di conseguenza, potrebbe verificarsi congestione di memoria. Questo è il punto in cui brilla la funzione fgets() e fornisce una soluzione definitiva.

Riferimenti

Source:
https://www.digitalocean.com/community/tutorials/fgets-and-gets-in-c-programming