Поряд з іншими добре поясненими відповідями з будь-якими побічними проблемами, я хотів би дати точну та стислу відповідь на поставлене питання.
Чому printf
з одним аргументом (без специфікаторів конверсії) застаріло?
printf
Виклик функції з одним аргументом в цілому НЕ застаріла і не має теж вразливостей при правильному використанні , як ви завжди повинні кодувати.
C Користувачі в усьому світі, починаючи від початківця статусу до експерта зі статусу, використовують printf
такий спосіб, щоб надати просту текстову фразу як вихід на консоль.
Крім того, хтось повинен розрізнити, чи є цей єдиний аргумент рядковим літералом чи покажчиком на рядок, який є дійсним, але зазвичай не використовується. Для останнього, звичайно, можуть статися незручні виходи або будь-який тип не визначеної поведінки , коли покажчик не встановлений належним чином, щоб вказувати на дійсну рядок, але це також може статися, якщо специфікатори формату не відповідають відповідним аргументам, надаючи численні аргументи.
Звичайно, також не правильно і правильно, що рядок, представлений як єдиний аргумент, має будь-які специфікатори формату або конверсії, оскільки перетворення не відбудеться.
Це сказав, надаючи простий рядковий літерал, як "Hello World!"
єдиний аргумент, без специфікаторів формату всередині цього рядка, як ви вказали його у питанні:
printf("Hello World!");
взагалі не є застарілою або " поганою практикою ", а також не має вразливих місць.
Насправді, багато програмістів на C починають і починають вивчати і використовувати мови С або навіть мови програмування взагалі з цією програмою HelloWorld і цим printf
твердженням як першими в своєму роді.
Вони не були б такими, якби вони застаріли.
У книзі, яку я читаю, написано, що printf
з одним аргументом (без специфікаторів перетворення) застаріла.
Ну, тоді я б зосередив увагу на книзі чи самому авторі. Якщо автор справді робить такі, на мій погляд, невірні твердження і навіть навчаючи, що не пояснюючи чітко, чому він / вона робить це (якщо ці твердження справді буквально еквівалентні, передбачені в цій книзі), я вважав би це поганою книгою. Хороша книга, на відміну від цього, повинна пояснити , чому , щоб уникнути певного роду програмування методів або функцій.
Згідно з тим, що я говорив вище, використання printf
лише одного аргументу (рядкового літералу) і без будь-яких специфікаторів формату ні в якому разі не застаріло і не вважається "поганою практикою" .
Ви повинні запитати автора, що він мав на увазі з тим, а ще краще, подумайте його, щоб уточнити чи виправити відповідний розділ для наступного видання чи відбитки взагалі.
printf("Hello World!")
це НЕ те ж саме , якputs("Hello World!")
.puts()
додає а'\n'
. Замість цього порівняйтеprintf("abc")
зfputs("abc", stdout)