ci sono due ragioni:
scanf()
può lasciare stdin
in uno stato che è difficile da prevedere; questo rende difficile il recupero degli errori se non impossibile (questo è meno un problema con fscanf()
); e
- L'intera famiglia
scanf()
accetta i puntatori come argomenti, ma non ha limiti di lunghezza, in modo da poter sovrascrivere un buffer e modificare variabili non correlate che si trovano dopo il buffer, causando errori di corruzione della memoria apparentemente casuali che sono molto difficili da capire, trovare, e debug, in particolare per i programmatori meno esperti C.
debuttante C i programmatori sono spesso confusi circa puntatori e “Indirizzo-di” operatore, e spesso omette il &
dove è necessario, o aggiungere “per buona misura” dove non è. Ciò causa segoults "casuali" che possono essere difficili da trovare per loro. Questa non è la colpa di scanf()
, quindi la lascio fuori dalla mia lista, ma vale la pena tenerla a mente.
dopo 23 anni, ho ancora ricordo che sia un dolore enorme quando ho iniziato C programmazione e non sapevo come riconoscere ed eseguire il debug di questi tipi di errori, e (come qualcuno che ha trascorso anni di insegnamento C per i principianti) è molto difficile spiegarli a un novizio che non ha ancora capito i puntatori e impila.
Chiunque consiglia scanf()
a un principiante C programmatore deve essere frodato senza pietà.
OK, forse non senza pietà, ma una sorta di fustigazione è sicuramente in ordine; o)
Si prega di cambiare 'gets()' a 'fgets()'. 'gets()' non dovrebbe mai essere usato. – Wiz
Deve essere stato un refuso :) Grazie per averlo capito. –