En plus des autres réponses bien expliquées avec toutes les préoccupations secondaires couvertes, je voudrais donner une réponse précise et concise à la question posée.
Pourquoi printf
un argument unique (sans spécificateurs de conversion) est-il obsolète?
Un printf
appel de fonction avec un seul argument en général n'est pas obsolète et n'a pas non plus de vulnérabilités lorsqu'il est utilisé correctement comme vous coderez toujours.
C Les utilisateurs du monde entier, du statut de débutant à celui d'expert en statut, l'utilisent printf
pour donner une simple phrase de texte en sortie à la console.
De plus, quelqu'un doit distinguer si ce seul et unique argument est une chaîne littérale ou un pointeur vers une chaîne, ce qui est valide mais généralement pas utilisé. Pour ce dernier, bien sûr, il peut se produire des sorties gênantes ou tout type de comportement non défini, lorsque le pointeur n'est pas correctement défini pour pointer vers une chaîne valide, mais ces choses peuvent également se produire si les spécificateurs de format ne correspondent pas aux arguments respectifs en donnant arguments multiples.
Bien sûr, il n'est pas non plus juste et correct que la chaîne, fournie comme un seul et unique argument, ait des spécificateurs de format ou de conversion, car il n'y aura pas de conversion.
Cela dit, donner un littéral de chaîne simple comme "Hello World!"
comme seul argument sans aucun spécificateur de format à l'intérieur de cette chaîne comme vous l'avez fourni dans la question:
printf("Hello World!");
n'est pas du tout obsolète ou « mauvaise pratique » et n'a aucune vulnérabilité.
En fait, de nombreux programmeurs C commencent et ont commencé à apprendre et à utiliser C ou même les langages de programmation en général avec ce programme HelloWorld et cette printf
déclaration comme les premiers du genre.
Ils ne le seraient pas s'ils étaient obsolètes.
Dans un livre que je lis, il est écrit printf
qu'avec un seul argument (sans spécificateurs de conversion) est obsolète.
Eh bien, alors je me concentrerais sur le livre ou sur l'auteur lui-même. Si un auteur fait vraiment de telles affirmations , à mon avis, des affirmations incorrectes et même enseigne cela sans expliquer explicitement pourquoi il / elle le fait (si ces affirmations sont vraiment littéralement équivalentes fournies dans ce livre), je considérerais cela comme un mauvais livre. Un bon livre, par opposition à cela, expliquera pourquoi éviter certains types de méthodes ou de fonctions de programmation.
D'après ce que j'ai dit ci-dessus, l'utilisation printf
avec un seul argument (une chaîne littérale) et sans aucun spécificateur de format n'est en aucun cas déconseillée ou considérée comme une "mauvaise pratique" .
Vous devriez demander à l'auteur ce qu'il voulait dire par là ou, mieux encore, lui demander de clarifier ou de corriger la section relative pour la prochaine édition ou les empreintes en général.
printf("Hello World!")
n'est pas la même chose queputs("Hello World!")
.puts()
ajoute un'\n'
. Comparez plutôtprintf("abc")
àfputs("abc", stdout)