Есть две причины:
scanf()
может оставить stdin
в таком состоянии, что трудно предсказать; это затрудняет восстановление ошибок, если не невозможно (это не проблема с fscanf()
); и
- Весь семейство
scanf()
принимает указатели в качестве аргументов, но не ограничивает длину, поэтому они могут переполнять буфер и изменять несвязанные переменные, которые происходят после буфера, вызывая, по-видимому, случайные ошибки коррупции памяти, которые очень трудно понять, найти, и отладки, особенно для менее опытных программистов C.
Начинающих C программистов часто путаются указатели и «Адреса» оператор, и часто опускает &
где это необходимо, или добавить «для хорошей меры», где это не так. Это приводит к «случайным» segfaults, которые могут быть трудными для них. Это не ошибка scanf()
, поэтому я оставляю ее в своем списке, но это стоит иметь в виду.
После 23 лет, я до сих пор помню это время огромная боль, когда я начал C программирования и не знал, как распознать и отлаживать эти виды ошибок, и (как кто-то, кто провел годы преподавания C новичкам) очень сложно объяснить их новичкам, которые еще не понимают указатели и стек.
Любой, кто рекомендует scanf()
новичку C программист должен быть беспощадно уничтожен.
ОК, может быть, не нещадно, но какой-то порка, безусловно, в порядке; о)
Пожалуйста, измените 'получает()' в 'fgets()'. 'gets()' никогда не должен использоваться никогда. – Wiz
Must'a был опечаткой :) Спасибо, что поймал это. –