Quelle est la différence entre printf () et puts () en C?
Je sais que vous pouvez imprimer avec printf()
et puts()
. Je peux aussi voir que printf()
vous permet d'interpoler des variables et de faire du formatage.
Est puts()
simplement une version primitive de printf()
. Devrait-il être utilisé pour tous les printf()
possibles sans interpolation de chaîne?
10 réponses
puts
est plus simple que printf
mais sachez que le premier ajoute automatiquement une nouvelle ligne. Si ce n'est pas ce que vous voulez, vous pouvez fputs
votre chaîne à stdout ou utiliser printf
.
(Ceci est souligné dans un commentaire de Zan Lynx, mais je pense que cela mérite un aswer - é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 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 compter sur cela (si mystr
est une variable au lieu d'un littéral) vous devrait - pas utiliser.
Donc, il est généralement dangereux-et conceptuellement faux - de passer une chaîne dynamique comme 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'ajoutez pas de saut de 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 (sans compter la valeur NULL finale).
Dans les cas simples, le compilateur convertit les appels à printf()
appels à puts()
.
Par exemple, le code suivant sera compilé dans le code d'assemblage que je montrerai 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é la source avec gcc -o hello hello.c
.
Droit, printf
peut être considéré comme une version plus puissante de puts
. printf
" donne la possibilité de format variables de sortie en utilisant les spécificateurs de format tels que %s
, %d
, %lf
, etc...
Dans mon expérience, printf()
transporte dans plus de code que puts()
indépendamment de la chaîne de format.
Si je n'ai pas besoin du formatage, Je n'utilise pas printf
. Cependant, fwrite
à stdout
fonctionne beaucoup plus vite que puts
.
static const char my_text[] = "Using fwrite.\n";
fwrite(my_text, 1, sizeof(my_text) - sizeof('\0'), stdout);
Note: Par Commentaires, '\ 0 ' est une constante entière. L'expression correcte devrait être sizeof(char)
, comme indiqué par les commentaires.
int puts(const char *s);
Puts () écrit la chaîne s et un retour à la ligne de fin dans stdout.
int printf(const char *format, ...);
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 fonction printf() est utilisée pour imprimer des chaînes et des variables sur l'écran tandis que la fonction puts() vous permet d'imprimer une chaîne uniquement sur votre écran.
Met le simple choix et ajoute une nouvelle ligne à la fin et printf écrit la sortie d'une chaîne formatée. Documentation met: http://linux.die.net/man/3/puts et pour le printf: http://linux.die.net/man/3/printf
Je recommande d'utiliser uniquement printf car cela est plus cohérent que la méthode de commutation, c'est-à-dire si vous déboguez, il est moins pénible de rechercher tous les printfs que les puts et printf. La plupart du temps, vous souhaitez afficher une variable dans vos impressions sous la forme Eh bien, donc puts est principalement utilisé dans le code d'exemple.
Lorsque l'on compare les puts()
et printf()
, même si leur consommation de mémoire est presque la même, puts()
prend plus de temps par rapport à printf()
.