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