70 votes

Pourquoi la chaîne de formatage printf du langage C contient-elle à la fois %c et %s ?

Pourquoi la chaîne de formatage printf du C a-t-elle les deux caractéristiques suivantes %c y %s ?

Sé que %c représente un seul caractère et %s représente une chaîne de caractères à terminaison nulle, mais la représentation de la chaîne ne suffirait-elle pas à elle seule ?

98voto

Mahesh Points 20994

Probablement pour faire la distinction entre une chaîne à terminaison nulle et un caractère. S'il n'y avait que %s alors chaque caractère doit également être terminé par un caractère nul.

char c = 'a';

Dans le cas ci-dessus, c doit avoir une terminaison nulle. C'est ce que je suppose :)

73voto

Luchian Grigore Points 136646

%s imprime des caractères jusqu'à ce qu'il atteigne un 0 (ou '\0' même chose).

Si vous n'avez qu'un char x; en l'imprimant avec printf("%s", &x); - *vous devez fournir l'adresse, puisque %s attend un `char** - donnerait des résultats inattendus, comme le montre l'exemple suivant&x + 1pourrait ne pas l'être0` .

Il n'est donc pas possible d'imprimer un seul caractère à moins qu'il ne soit à terminaison nulle (ce qui est très inefficace).

EDIT : Comme d'autres l'ont souligné, les deux attendent des choses différentes dans les paramètres var args - l'un un pointeur, l'autre un simple char. Mais cette différence est assez claire.

37voto

Jens Gustedt Points 40410

Le problème mentionné par d'autres, à savoir qu'un seul caractère doit être terminé par un caractère nul, n'est pas réel. Il pourrait être résolu en apportant une précision au format %.1s ferait l'affaire.

Ce qui est plus important à mon avis, c'est que pour les %s sous toutes ses formes, vous devez fournir un pointeur sur un ou plusieurs caractères. Cela signifie que vous ne pourriez pas imprimer des valeurs r (expressions calculées, retours de fonctions, etc.) ou enregistrer des variables.

Edita: Je suis vraiment énervé par la réaction à cette réponse, je vais donc probablement supprimer cette réponse, cela n'en vaut vraiment pas la peine. Il semble que les gens réagissent à cette réponse sans même avoir lu la question ou sans savoir comment apprécier la technicité de la question.

Soyons clairs : je ne dis pas qu'il faut préférer %.1s plus %c . Je dis seulement que les raisons pour lesquelles %c ne peuvent être remplacés par qui sont différents de l'autre réponse prétendent dire. Ces autres réponses sont tout simplement erronées d'un point de vue technique. La terminaison nulle n'est pas un problème avec %s .

28voto

Claptrap Points 21299

La fonction printf est une fonction variadique, ce qui signifie qu'elle a un nombre variable d'arguments. Les arguments sont placés sur la pile avant que la fonction (printf) ne soit appelée. Pour que la fonction printf puisse utiliser la pile, elle a besoin d'informations sur ce qui s'y trouve.

par exemple

printf( "%c", ch );    tells the function the argument 'ch' 
                       is to be interpreted as a character and sizeof(char)

considérant que

printf( "%s", s );   tells the function the argument 's' is a pointer 
                     to a null terminated string sizeof(char*)

il n'est pas possible, à l'intérieur de la fonction printf, de déterminer autrement le contenu de la pile, par exemple en faisant la distinction entre "ch" et "s", parce qu'en C, il n'y a pas de vérification de type pendant l'exécution.

13voto

Juan Mendes Points 31678

%s dit d'imprimer tous les caractères jusqu'à ce que vous trouviez un null (traitez la variable comme un pointeur).

%c indique d'imprimer un seul caractère (traiter la variable comme un code de caractère)

Utilisation %s pour un caractère ne fonctionne pas parce que le caractère va être traité comme un pointeur, puis il va essayer d'imprimer tous les caractères qui suivent cet endroit en mémoire jusqu'à ce qu'il trouve un caractère null

Voler les autres réponses pour l'expliquer différemment.

Si vous voulez imprimer un caractère en utilisant %s vous pourriez utiliser ce qui suit pour lui passer correctement l'adresse d'un char et l'empêcher d'écrire des déchets sur l'écran jusqu'à ce qu'il trouve un null.

char c = 'c';
printf('%.1s', &c);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X