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?

146
demandé sur alex 2010-03-16 16:03:28

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.

118
répondu Michael Kristofik 2010-03-16 13:06:06

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

77
répondu leonbloy 2018-09-08 12:32:37

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

28
répondu echristopherson 2012-06-17 08:04:55

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.

16
répondu Hannu Balk 2017-08-18 10:45:48

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

11
répondu Justin Ethier 2012-10-17 00:45:57

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.

11
répondu Thomas Matthews 2017-04-04 18:08:16
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.

8
répondu Muhammed Abiola 2015-03-16 18:17:52

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.

5
répondu Wesley Nyandika 2010-06-11 05:24:53

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.

2
répondu Johan Engblom 2015-06-16 12:16:42

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

1
répondu thil 2015-05-11 11:56:33