Je sais que vous pouvez imprimer avec printf()
et puts()
. Je peux également voir que cela printf()
vous permet d'interpoler des variables et de faire du formatage.
Est puts()
simplement une version primitive de printf()
. Doit-il être utilisé pour tous les possibles printf()
sans interpolation de chaîne?
printf(variable)
pour imprimer une chaîne. Utilisezputs(variable)
ouprintf("%s', variable)
. Il y a un risque de sécurité à utiliser une chaîne de format de variable: si la variable peut être écrite par un attaquant, ils peuvent attaquer le programme en utilisant des chaînes de format.Réponses:
puts
est plus simple,printf
mais sachez que le premier ajoute automatiquement une nouvelle ligne. Si ce n'est pas ce que vous voulez, vous pouvezfputs
stdout ou utiliser votre chaîneprintf
.la source
(Ceci est souligné dans un commentaire de Zan Lynx, mais je pense que cela mérite une réponse - étant donné que la réponse acceptée ne le mentionne pas).
La différence essentielle entre
puts(mystr);
etprintf(mystr);
est que dans ce dernier, l'argument est interprété comme une chaîne de formatage . Le résultat sera souvent le même (sauf pour le saut de ligne ajouté) si la chaîne ne contient aucun caractère de contrôle (%
) mais si vous ne pouvez pas vous fier à cela (simystr
est une variable au lieu d'un littéral), vous ne devez pas l' utiliser.Donc, il est généralement dangereux - et conceptuellement faux - de passer une chaîne dynamique comme argument unique de
printf
:La même chose s'applique à
fputs
vsfprintf
(maisfputs
n'ajoute pas de nouvelle ligne).la source
printf()
serait-elle moins efficace? Lors de l'exécution? Au moment de la compilation?printf
doit analyser la chaîne de format. Cependant, cela ne devrait normalement pas être pertinent. De plus, un compilateur intelligent pourrait optimiser cela et remplacer l'printf
appel àputs
Outre le formatage,
puts
renvoie un entier non négatif en cas de succès ou d'EOF
échec; whileprintf
renvoie le nombre de caractères imprimés (sans compter le nul de fin).la source
Dans les cas simples, le compilateur convertit les appels
printf()
en appels àputs()
.Par exemple, le code suivant sera compilé dans le code d'assembly que je montrerai ensuite.
Dans cet exemple, j'ai utilisé la version 4.7.2 de GCC et compilé le source avec
gcc -o hello hello.c
.la source
printf("Hello world!\n");
gcc qui traduit effectivement cela en put. Puisqu'il s'agit d'un ancien message, je vais le modifier moi-même.-save-temps
option pour gcc fait çaBien,
printf
pourrait être considéré comme une version plus puissante deputs
.printf
offre la possibilité de formats des variables de sortie en utilisant spécificateurs de format tels que%s
,%d
,%lf
, etc ...la source
Dans mon expérience,
printf()
transporte plus de code queputs()
quelle que soit la chaîne de format.Si je n'ai pas besoin du formatage, je ne l'utilise pas
printf
. Cependant,fwrite
pourstdout
fonctionne beaucoup plus vite queputs
.Remarque: par commentaire, '\ 0' est une constante entière. L'expression correcte doit être
sizeof(char)
celle indiquée par les commentaires.la source
'\0'
a un typeint
, donc sur la plupart des systèmes, cela s'imprimeraUsing fwrit
. Si vous souhaitez imprimer 1 octet de moins, utilisez simplement 1.sizeof (char)
, ce qui est probablement ce que vous vouliez ici, est garanti 1.met () écrit la chaîne s et une nouvelle ligne de fin dans stdout.
La fonction printf () écrit la sortie dans stdout, sous le contrôle d'une chaîne de format qui spécifie comment les arguments suivants sont convertis pour la sortie.
Je vais profiter de cette occasion pour vous demander de lire la documentation.
la source
la fonction printf () est utilisée pour imprimer à la fois des chaînes et des variables à l'écran tandis que la fonction put () vous permet uniquement d'imprimer une chaîne uniquement sur votre écran.
la source
puts
est le choix simple et ajoute une nouvelle ligne à la fin etprintf
écrit la sortie à partir d'une chaîne formatée.Consultez la documentation pour
puts
et pourprintf
.Je recommanderais de l'utiliser uniquement
printf
car c'est plus cohérent que la méthode de commutation, c'est-à-dire que si vous déboguez, il est moins difficile de rechercher tous les printfs queputs
etprintf
. La plupart du temps, vous souhaitez également afficher une variable dans vos impressions, elleputs
est donc principalement utilisée dans le code d'exemple.la source
Lorsque vous comparez
puts()
etprintf()
, même si leur consommation de mémoire est presque la même,puts()
prend plus de temps queprintf()
.la source