Semplice.
Tanto per cominciare il parametro che indica la lunghezza massima da leggere dev'essere necessariamente una costante, quindi non può essere determinato run-time.
Poi l'utilizzo di scanf implica necessariamente la certezza del tipo di input, e fino a quando uno si limita a programmi del tipo hello world application questi problemi non li nota, ma manca poco da li a programmi dove l'utilizzo di una scanf è assolutamente da evitare.
Qualcuno potrebbe dire che se non sei sicuro dell'input leggi l'intera riga e elabori successivamente i dati. Solo pensare di risolvere un problema, di qualsiasi tipo, con questa soluzione è poco efficiente. Si potrebbe fare, la scanf() accetta come delimitatore di default un carattere white-space o End-Of-File, ma tu ricordi esattamente la sintassi per fare ciò? Io no personalmente, dovrei andarmela a riguardare e credo anche l'utente medio o comunque meno esperto. Basandomi spesso sul dover determinare l'efficienza di un algoritmo ho imparato a dover considerare anche il tempo di implementazione e usare la scanf in questo caso vorrebbe dire aver tempo da perdere, potendo usare invece la fgets().
La scanf() lascia inoltre sul buffer di input normalmente la newline di fine riga e se uno non sta attento ogni volta (magari con un %*c o fflush(stdin)) diventa nuovamente una rottura se non ci sei abituato.
Insomma non è solo una questione del codice della funzione, ma di come può essere utilizzata dall'utente medio. Ed è questo che poi sta alla base dello sviluppo del linguaggio di programmazione stesso, basti vedere lo sviluppo del C++, molto più "comodo" e più "semplice" del C sotto questi aspetti, o meglio ancora lo sviluppo da Visual Basic a Visual Basic .NET.
Per concludere, ci saranno sicuramente altre motivazioni che ad un non espertissimo programmatore come me sfuggono.![]()
PS: le vostre opinioni e suggerimenti sempre ben accetti, siamo qui anche per imparare![]()