- 17 Aprile 2010
- 588
- 0
- Miglior risposta
- 0
Chiariamo prima di tutto cos'è la stdin. La stdin non sarebbe altro che l'input dal quale digitiamo tutti i comandi. Quando pigiamo sulla tastiera un tasto, non facciamo altro che inviare in input al nostro computer un codice binario che identifica quel tasto e che ci permette di interagire con la macchina, per questo motivo è molto importante in C come in tutti i linguaggi avere ben chiaro come sfruttare lo stdin per salvare dei dati che vogliamo immettere. Si pensi ad esempio ad una calcolatrice, come potremmo interagire per eseguire le operazioni se non utilizzassimo l'input!?
In C abbiamo vari modi per salvare i dati dentro le variabili, essi sono principalmente 4:
-scanf
-fgets
-gets
-libreariadline (utilizzato solo su Linux)
La sintassi di scanf è la seguente:
scanf("%d", &a);
La d vicino il %, richiama il tipo di dato in questo caso int (numero intero) la a sarebbe la variabile nella quale salvare il dato. Ma passiamo ad esaminare un pezzo di codice:
Vi è il rischio overflow in questo pezzo di codice difatti scanf, non controlla la lunghezza della stringa inserita, quindi il programma è a rischio crash, tuttavia vi sono dei casi in cui è preferibile l'uso della scanf, come in combinazione con le struct, con le quali è più difficile usare fgets che andremo a vedere ora.
Fgets è un'istruzione molto sicura e alquanto funzionale in un programma, per salvare dati in una variabile. La sua sintassi è la seguente:
fgets( a, 10, stdin);
Dove a sarebbe la variabile nel quale salvare i dati, 10 la lunghezza massima consentita e la stdin corrisponde al nostro input, ovvero comunichiamo a fgets che provengono dei dati da stdin. Inoltre la fgets prende in input sempre n-1 caratteri per cui, nel codice saranno 9 caratteri al massimo.
Come potete intuire fgets controlla la lunghezza della stringa inserita, quindi è più sicura per il programma evitando crash eliminando il possibile overflow. Come detto in precedenza, a volte bisogna preferire scanf, ma fgets resta sicuramente una valida funzione per salvare dei dati da Stdin.
Gets invece si considera totalmente obsoleta e si studia solo per dovere di cronaca. Essa si trova nella libreria(libreria è solo il significante italiano, il termine corretto è header) stdio.h ed viene sconsigliato fortemente, in quanto fa andare quasi sempre il programma in overflow. Per capire meglio esaminiamo un pezzo di codice:
Come possiamo notare viene salvato il dato inserito nella variabile senza alcun controllo! Ciò mette a serio rischio il programma, difatti al 99% ci sarà un crash utilizzando questa funzione, che è mantenuta nelle librerie del C solo per retrocompatibilità. Il controllo infatti non avviene ne sul tipo della variabile ne sulla grandezza, per cui il mio consiglio è di limitarsi alla conoscenza di questa funzione.
Infine la libreriadline, prerogativa esclusivamente dei sistemi linux che è caldamente consigliato per imparare a programmare, specialmente in C. Si consideri che ci sono molte funzioni che sono disponibili solo su Linux per quanto riguarda il C; per poterla utilizzare basta includere nel vostro programma queste due header:
#include <readline.h>
#include <history.h>
Per salvare i dati basta usare questo codice:
Che non fa altro che leggere da input attraverso readline, la linea corrente di tipo char(carattere). Passiamo ad analizzare il codice; char indica il tipo di variabile, in questo caso carattere, *line è un puntatore. Readline invece è un istruzione che permette di leggere quello che verrà scritto fra ".." e salvarlo nella variabile. Ricordo nuovamente che questo metodo è utilizzabile solo su Linux.
La guida la ho scritta personalmente, senza copiarla da nessun forum e\o altra sorgente. Spero che vi sia utile^^
In C abbiamo vari modi per salvare i dati dentro le variabili, essi sono principalmente 4:
-scanf
-fgets
-gets
-libreariadline (utilizzato solo su Linux)
La sintassi di scanf è la seguente:
scanf("%d", &a);
La d vicino il %, richiama il tipo di dato in questo caso int (numero intero) la a sarebbe la variabile nella quale salvare il dato. Ma passiamo ad esaminare un pezzo di codice:
PHP:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Vi è il rischio overflow in questo pezzo di codice difatti scanf, non controlla la lunghezza della stringa inserita, quindi il programma è a rischio crash, tuttavia vi sono dei casi in cui è preferibile l'uso della scanf, come in combinazione con le struct, con le quali è più difficile usare fgets che andremo a vedere ora.
Fgets è un'istruzione molto sicura e alquanto funzionale in un programma, per salvare dati in una variabile. La sua sintassi è la seguente:
fgets( a, 10, stdin);
Dove a sarebbe la variabile nel quale salvare i dati, 10 la lunghezza massima consentita e la stdin corrisponde al nostro input, ovvero comunichiamo a fgets che provengono dei dati da stdin. Inoltre la fgets prende in input sempre n-1 caratteri per cui, nel codice saranno 9 caratteri al massimo.
PHP:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Come potete intuire fgets controlla la lunghezza della stringa inserita, quindi è più sicura per il programma evitando crash eliminando il possibile overflow. Come detto in precedenza, a volte bisogna preferire scanf, ma fgets resta sicuramente una valida funzione per salvare dei dati da Stdin.
Gets invece si considera totalmente obsoleta e si studia solo per dovere di cronaca. Essa si trova nella libreria(libreria è solo il significante italiano, il termine corretto è header) stdio.h ed viene sconsigliato fortemente, in quanto fa andare quasi sempre il programma in overflow. Per capire meglio esaminiamo un pezzo di codice:
PHP:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Come possiamo notare viene salvato il dato inserito nella variabile senza alcun controllo! Ciò mette a serio rischio il programma, difatti al 99% ci sarà un crash utilizzando questa funzione, che è mantenuta nelle librerie del C solo per retrocompatibilità. Il controllo infatti non avviene ne sul tipo della variabile ne sulla grandezza, per cui il mio consiglio è di limitarsi alla conoscenza di questa funzione.
Infine la libreriadline, prerogativa esclusivamente dei sistemi linux che è caldamente consigliato per imparare a programmare, specialmente in C. Si consideri che ci sono molte funzioni che sono disponibili solo su Linux per quanto riguarda il C; per poterla utilizzare basta includere nel vostro programma queste due header:
#include <readline.h>
#include <history.h>
Per salvare i dati basta usare questo codice:
PHP:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Che non fa altro che leggere da input attraverso readline, la linea corrente di tipo char(carattere). Passiamo ad analizzare il codice; char indica il tipo di variabile, in questo caso carattere, *line è un puntatore. Readline invece è un istruzione che permette di leggere quello che verrà scritto fra ".." e salvarlo nella variabile. Ricordo nuovamente che questo metodo è utilizzabile solo su Linux.
La guida la ho scritta personalmente, senza copiarla da nessun forum e\o altra sorgente. Spero che vi sia utile^^
Ultima modifica: