Quelle est la différence entre les printf() et met() en C?
Je sais que vous pouvez imprimer avec printf()
et puts()
. Je vois aussi que printf()
vous permet d'interpoler les variables et faire la mise en forme.
Est puts()
simplement une version primitive de printf()
. Doit-il être utilisé pour tous les printf()
sans chaîne interpolation?
- puts() et printf() - C/C++ Réponses
- Juste une remarque sur l'utilisation de printf, au lieu de met: ne jamais, jamais faire un
printf(variable)
pour imprimer une chaîne de caractères. Utilisationputs(variable)
ouprintf("%s', variable)
. Il y a un risque pour la sécurité à l'aide d'une variable de chaîne de format: si la variable peut être écrit par un utilisateur malveillant, ils peuvent attaquer le programme à l'aide de chaînes de format.
Vous devez vous connecter pour publier un commentaire.
puts
est plus simple queprintf
mais sachez que l'ancienne ajoute automatiquement un saut de ligne. Si ce n'est pas ce que vous voulez, vous pouvezfputs
votre chaîne de caractères sur la sortie standard ou utiliserprintf
.(Cela est souligné dans un commentaire de Zan Lynx, mais je pense qu'il mérite une aswer - étant donné que l'on a accepté de répondre à n'en parle pas).
La différence essentielle entre
puts(mystr);
etprintf(mystr);
est que dans ce dernier, l'argument est interprété comme un chaîne de mise en forme. Le résultat sera souvent le même (sauf pour le retour à la ligne) si la chaîne ne contient pas de caractères de contrôle (%
), mais si vous ne pouvez pas compter sur qui (simystr
est une variable au lieu d'un littéral), vous devez pas l'utiliser.Donc, il est généralement dangereux et sur le plan conceptuel mal- pour passer d'une chaîne dynamique comme unique argument de
printf
:La même chose s'applique à
fputs
vsfprintf
(maisfputs
n'ajoutez pas de saut de ligne).printf()
être moins efficace? Au moment de l'exécution? Au moment de la compilation?printf
besoins d'analyser la chaîne de format. Toutefois, cela devrait normalement être hors de propos. De plus, un savant compilateur peut optimiser ce, et de remplacer leprintf
avec appel à laputs
Outre la mise en forme,
puts
renvoie un entier non négatif en cas de succès ouEOF
en cas d'échec; tandis queprintf
retourne le nombre de caractères imprimés (non compris le null de fin).Dans les cas simples, le compilateur convertit les appels à
printf()
à des appels àputs()
.Par exemple, le code suivant va être compilé à l'assemblée de code que j'ai à côté.
Dans cet exemple, j'ai utilisé la version de GCC 4.7.2 et compilé les sources avec
gcc -o hello hello.c
.printf("Hello world!\n");
gcc, en effet, traduit de met. Depuis c'est un vieux message, je vais l'éditer moi-même.-save-temps
option de gcc n'est queDans mon expérience,
printf()
transporte dans plus de code queputs()
indépendamment de la chaîne de format.Si je n'ai pas besoin de la mise en forme, je n'utilise pas
printf
. Cependant,fwrite
àstdout
fonctionne beaucoup plus vite queputs
.Remarque: pour les commentaires, '\0' est un entier constant. L'expression correcte devrait être
sizeof(char)
comme indiqué par les commentaires.'\0'
a typeint
, de sorte que sur la plupart des systèmes, ce sera impriméeUsing fwrit
. Si vous souhaitez imprimer moins 1 octet, il suffit d'utiliser 1.sizeof (char)
, ce qui est probablement ce que vous aviez l'intention, ici, est garantie 1.Droit,
printf
pourrait être considéré comme une version plus puissante deputs
.printf
offre la possibilité de format variables de sortie en utilisant les spécificateurs de format comme%s
,%d
,%lf
, etc...puts() écrit la chaîne de caractères s et de suivi de retour à la ligne sur la sortie standard stdout.
La fonction printf() écrit de sortie vers stdout, sous le contrôle d'un format de chaîne de caractères qui spécifie la façon dont 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 les puts() fonction vous permet d'imprimer une chaîne uniquement à votre écran.
met est 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 vous recommande d'utiliser uniquement printf ce qui est plus cohérent que le méthode de commutation, j'.e si vous debbugging il est moins pénible de rechercher tous les printfs que met et printf. La plupart du temps que vous voulez à la sortie d'une variable dans vos impressions ainsi, expose est principalement utilisé dans l'exemple de code.
Lorsque l'on compare les
puts()
etprintf()
, même si leur consommation de mémoire est presque la même,puts()
prend plus de temps par rapport àprintf()
.