Mi sembra che le persone, soprattutto quando imparano il linguaggio di programmazione C, stiano ancora utilizzando la funzione gets
per leggere i dati da stdin. Nonostante che ora è stato rimosso dallo standard C11, e un disclaimer sul cppreference legge:È stato sempre utile?
La ottiene (funzione) non esegue il controllo dei limiti, pertanto, questa funzione è estremamente vulnerabile al buffer overflow attacchi. Non è possibile utilizzare 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 ha deprecato nella terza rettifica allo standard C99 e rimosso completamente nello standard C11. fgets() e gets_s() sono le sostituzioni consigliate da .
Non utilizzare mai gets().
Tuttavia, sembra che questo non sia un nuovo problema che ha prodotto filosofie di programmazione più moderne. Sarebbe sempre stato interrotto e avrebbe causato l'arresto anomalo dei programmi e non vedo cosa si possa intendere per "ambiente che limita ciò che può apparire su stdin".
Quindi, era sempre utile in passato? O qual è la ragione per cui è stata aggiunta agli standard precedenti e alle versioni pre-standard di C?
(1) ... o almeno modificati per avere un parametro aggiuntivo che indica la lunghezza massima di leggere. Sto chiedendo comunque della vecchia firma, ricevendo solo un puntatore.
Da [le FAQ] (http://stackoverflow.com/faq) * "Dovresti solo porre domande pratiche e di risposta ** basate sui problemi reali che stai affrontando ** ..." * (la mia enfasi). –
???? http://stackoverflow.com/questions/3302255/c-scanf-vs-gets-vs-fgets –
@TJCrowder - dice anche "problemi che sono unici per la professione di programmatore", non chiederei sull'utilizzo dell'API al di fuori della professione di programmazione – Mike