Je sais que vous pouvez imprimer avec printf()
et puts()
. Je peux aussi voir que printf()
vous permet d'interpoler des variables et de formater.
_ puts()
n'est-il qu'une version primitive de printf()
. Devrait-il être utilisé pour chaque printf()
possible sans interpolation de chaîne?
puts
est plus simple que printf
mais sachez que l'ancien ajoute automatiquement une nouvelle ligne. Si ce n'est pas ce que vous voulez, vous pouvez fputs
votre chaîne sur stdout ou utiliser printf
.
(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);
et printf(mystr);
est que dans ce dernier l'argument est interprété comme un chaîne de formatage. Le résultat sera souvent le même (à l'exception de la nouvelle ligne ajoutée) si la chaîne ne contient aucun caractère de contrôle (%
) mais si vous ne pouvez pas compter sur celui-ci (si mystr
est une variable au lieu de vous devriez ne pas l'utiliser .
Donc, il est généralement dangereux - et conceptuellement faux - de passer une chaîne dynamique en argument unique de printf
:
char * myMessage;
// ... myMessage gets assigned at runtime, unpredictable content
printf(myMessage); // <--- WRONG! (what if myMessage contains a '%' char?)
puts(myMessage); // ok
printf("%s\n",myMessage); // ok, equivalent to the previous, perhaps less efficient
La même chose s'applique à fputs
vs fprintf
(mais fputs
n'ajoute pas la nouvelle ligne).
Outre le formatage, puts
renvoie un entier non négatif en cas de succès ou EOF
en cas d'échec; tandis que printf
renvoie le nombre de caractères imprimés (n'incluant pas le dernier caractère).
Dans des cas simples, le compilateur convertit les appels en printf()
en appels en puts()
.
Par exemple, le code suivant sera compilé dans le code Assembly que je montre ensuite.
#include <stdio.h>
main() {
printf("Hello world!");
return 0;
}
Push rbp
mov rbp,rsp
mov edi,str.Helloworld!
call dword imp.puts
mov eax,0x0
pop rbp
ret
Dans cet exemple, j'ai utilisé GCC version 4.7.2 et compilé le source avec gcc -o hello hello.c
.
D'après mon expérience, printf()
transporte plus de code que puts()
, quelle que soit la chaîne de formatage.
Si je n'ai pas besoin du formatage, je n'utilise pas printf
. Cependant, fwrite
à stdout
fonctionne beaucoup plus rapidement que puts
.
static const char my_text[] = "Using fwrite.\n";
fwrite(my_text, 1, sizeof(my_text) - sizeof('\0'), stdout);
Remarque: selon les commentaires, '\ 0' est une constante entière. L'expression correcte doit être sizeof(char)
comme indiqué par les commentaires.
Bien, printf
pourrait être considéré comme une version plus puissante de puts
. printf
offre la possibilité de format variables pour la sortie à l'aide de spécificateurs de format tels que %s
, %d
, %lf
, etc ...
int puts(const char *s);
met () écrit la chaîne s et une nouvelle ligne fin sur stdout.
int printf(const char *format, ...);
La fonction printf () écrit la sortie sur 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 fonction printf () est utilisée pour imprimer les chaînes et les variables à l'écran, tandis que la fonction put () vous permet uniquement d'imprimer une chaîne uniquement sur votre écran.
met est le choix simple et ajoute une nouvelle ligne à la fin et printf écrit le résultat à partir d'une chaîne formatée. Documentation pour les options de vente: http://linux.die.net/man/3/puts et pour printf: http://linux.die.net/man/3/printf
Je recommanderais d’utiliser uniquement printf car c’est plus cohérent que la méthode de commutation, c’est-à-dire que si vous effectuez un débogage, il est moins pénible de rechercher tous les printfs que put et printf. La plupart du temps, vous souhaitez également générer une variable dans vos impressions. Par conséquent, l'option put est principalement utilisée dans le code d'exemple.
Lorsque vous comparez puts()
et printf()
, même si leur consommation de mémoire est presque identique, puts()
prend plus de temps que printf()
.