Помимо других хорошо объясненных ответов с затронутыми побочными проблемами, я хотел бы дать точный и краткий ответ на заданный вопрос.
Почему printf
использование одного аргумента (без спецификаторов преобразования) устарело?
printf
Вызов функции с одним аргументом в целом не устарела и не имеет также не уязвимостей при правильном использовании , как вы всегда должны кодировать.
C Пользователи всего мира, от новичка до статусного эксперта, используют printf
этот способ для вывода простой текстовой фразы на консоль.
Более того, Кто-то должен различать, является ли этот единственный аргумент строковым литералом или указателем на строку, которая действительна, но обычно не используется. Для последнего, конечно, могут возникать неудобные выходные данные или любое неопределенное поведение , когда указатель не установлен должным образом, чтобы указывать на допустимую строку, но эти вещи также могут происходить, если спецификаторы формата не соответствуют соответствующим аргументам, давая несколько аргументов.
Конечно, также неправильно и неправильно, чтобы строка, предоставленная в качестве одного-единственного аргумента, имела какие-либо спецификаторы формата или преобразования, поскольку преобразование не произойдет.
Тем не менее, предоставление простого строкового литерала, такого "Hello World!"
как единственный аргумент, без каких-либо спецификаторов формата внутри этой строки, как вы указали в вопросе:
printf("Hello World!");
не является устаревшим и не является " плохой практикой ", и не имеет никаких уязвимостей.
Фактически, многие программисты на C начинают и начинают изучать и использовать C или даже языки программирования в целом с этой программы HelloWorld и этого printf
оператора как первых в своем роде.
Их бы не было, если бы они были устаревшими.
В книге, которую я читаю, написано, что printf
использование одного аргумента (без спецификаторов преобразования) не рекомендуется.
Что ж, тогда я сосредоточился бы на книге или на самом авторе. Если автор действительно делает такие, на мой взгляд, неправильные утверждения и даже преподает это, не объясняя явно, почему он / она это делает (если эти утверждения действительно буквально эквивалентны приведенным в этой книге), я бы счел это плохой книгой. Хорошая книга, в отличие от этого, должна объяснить , почему , чтобы избежать определенного рода программирования методов или функций.
Согласно тому, что я сказал выше, использование printf
только с одним аргументом (строковым литералом) и без каких-либо спецификаторов формата ни в коем случае не считается устаревшим и не считается «плохой практикой» .
Вы должны спросить автора, что он имел в виду, или, что еще лучше, попросите его уточнить или исправить соответствующий раздел для следующего издания или отпечатков в целом.
printf("Hello World!")
это не то же самое , какputs("Hello World!")
.puts()
добавляет'\n'
. Вместо этого сравнитеprintf("abc")
сfputs("abc", stdout)