Es gibt zwei Gründe:
scanf()
stdin
in einem Zustand hinterlassen, die schwer vorherzusagen sind; dies macht eine Fehlerwiederherstellung schwierig, wenn nicht unmöglich (dies ist weniger ein Problem mit fscanf()
); und
- Die gesamte
scanf()
Familie nehmen Zeiger als Argumente, aber keine Längenbeschränkung, so können sie einen Puffer überlaufen und ändern nicht verwandte Variablen, die zufällig nach dem Puffer sind, was scheinbar zufällige Speicher Korruption Fehler, die sehr schwer zu verstehen, zu finden, und Debugging, insbesondere für weniger erfahrene C Programmierer.
Novice C Programmierer sind oft verwirrt über Zeiger und die „Adresse-of“ Operator und häufig die &
auslassen, wo sie gebraucht wird, oder es hinzufügen „für eine gute Maßnahme“, wo es nicht ist. Dies verursacht "zufällige" Segfaults, die für sie schwer zu finden sind. Das ist nicht scanf()
's Schuld, also lasse ich es von meiner Liste, aber es lohnt sich, daran zu denken.
Nach 23 Jahren haben mich noch daran erinnern, es ist ein großer Schmerz zu sein, wenn ich C Programmierung begonnen und wusste nicht, wie diese Art von Fehler zu erkennen und zu debuggen und (als jemand, der jahrelang Unterricht C an Anfänger) es ist sehr schwer, sie einem Neuling zu erklären, der Zeiger und Stapel noch nicht versteht.
Wer scanf()
an einen Anfänger C Programmierer empfiehlt, sollte gnadenlos ausgepeitscht werden.
OK, vielleicht nicht gnadenlos, sondern eine Art von Auspeitschung ist auf jeden Fall in Ordnung; o)
Bitte ändern 'gets()' auf 'fgets()'. 'gets()' sollte nie benutzt werden. – Wiz
Must'a war ein Tippfehler :) Danke für das Abfangen. –