web-dev-qa-db-fra.com

Quelle est la différence entre printf () et met () 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 formater.

_ puts() n'est-il qu'une version primitive de printf(). Devrait-il être utilisé pour chaque printf() possible sans interpolation de chaîne?

163
alex

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.

130
Michael Kristofik

(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).

86
leonbloy

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).

30
echristopherson

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.

16
Hannu Balk

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.

11
Thomas Matthews

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 ...

10
Justin Ethier
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.

8
user1831086

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.

5
Wesley Nyandika

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.

2
Johan Engblom

Lorsque vous comparez puts() et printf(), même si leur consommation de mémoire est presque identique, puts() prend plus de temps que printf().

1
thil