In C11 gets
è stato sostituito da gets_s
che ha la seguente dichiarazione:
char *gets_s(char *str, rsize_t n);
Questa funzione leggerà al massimo n-1
caratteri da stdin
in *str
. Questo per evitare la vulnerabilità di overflow del buffer inerente a gets
. La funzione fgets
è anche un'opzione. Da http://en.cppreference.com/w/c/io/gets:
Il gets() funzione non esegue il controllo dei limiti, pertanto, questa funzione è estremamente vulnerabile al buffer-overflow attacchi. Non può essere usato in modo sicuro (a meno che il programma non sia eseguito in un ambiente che limita ciò che può apparire su stdin). Per questo motivo, la funzione è stata deprecata nella terza rettifica dello standard C99 e completamente rimossa nello standard C11. fgets() e gets_s() sono le sostituzioni consigliate.
Non utilizzare mai gets().
Dato che gets_s
è definito in un'estensione dello standard, solo opzionalmente implementato, probabilmente si dovrebbe scrivere i tuoi programmi usando fgets
invece. Se si utilizza su stdin
, il programma verrà compilato anche nelle versioni precedenti di C. Ma tenere presente la differenza nel comportamento: quando gets_s
ha letto n-1
caratteri continua a leggere finché non viene raggiunta una nuova riga o fine del file , scartando l'input. Quindi, con gets_s
stai sempre leggendo un'intera riga, anche se solo una parte di essa può essere restituita nel buffer di input.
fgets (..., ..., stdin) –