303 votes

Comment échapper au signe % (pourcent) dans le printf du C ?

Comment échapper au signe % en utilisant printf en C ?

printf("hello\%"); /* not like this */

0 votes

"hello\%" ne fonctionne pas car il produit la chaîne de caractères hello% plus NUL, tout comme "hello%" fait.

0 votes

"hello\%" ne fonctionne pas car... pour moi... il ne compile pas. J'ai utilisé Microsoft Visual Studio 2017. La compilation échoue avec le message : '%': unrecognized character escape sequence.

459voto

Pablo Santa Cruz Points 73944

Vous pouvez y échapper en affichant un double "%" comme ceci : %%

En utilisant votre exemple :

printf("hello%%");

L'échappement du signe '%' est seulement pour printf . Si vous le faites :

char a[5];
strcpy(a, "%%");
printf("This is a's value: %s\n", a);

Il s'imprimera : This is a's value: %%

9 votes

"printf("hello%%") ;" est correct. Mais ce n'est pas un échappement je pense. utiliser printf("hello \045 ") ;

1 votes

@Pablo Santa Cruz : cette méthode pour "s'échapper" % est spécifique à printf n'est-ce pas ?

0 votes

Pour les fonctions formatées (afaik ils se terminent tous avec un f ) en général, en effet !

40voto

Mikeage Points 3796

Comme d'autres l'ont dit, le %% échappera au %.

Notez cependant que vous ne devez jamais faire cela :

char c[100];
char *c2;
...
printf(c); /* OR */
printf(c2);

Chaque fois que vous devez imprimer une chaîne, toujours, toujours, toujours, toujours l'imprimer en utilisant

printf("%s", c)

pour empêcher un % embarqué de causer des problèmes (violations de la mémoire, défauts de segmentation etc.).

0 votes

L'avertissement est généralement approprié, mais il peut y avoir des situations dans lesquelles vous voulez faire "ceci" - tant que vous savez que la chaîne que vous fournissez sera interprétée comme une chaîne de format.

4 votes

J'ai trouvé une solution alternative une fois - copier le tampon vers un autre tampon et ensuite le parcourir en doublant les signes %. J'ai fini par trouver cette idée et j'ai remplacé une fonction de 20-30 lignes par une seule ligne. Ne vous inquiétez pas, je me suis battu sévèrement sur la tête, comme je le méritais.

0 votes

C'est vrai, mais n'oubliez pas que 99% du temps, lorsque vous obtenez une chaîne de format, vous obtenez les arguments sous forme de va_list, et vous devez donc utiliser vprintf. Donc, je suis techniquement correct ;)

34voto

Sinan Ünür Points 76179

S'il n'y a pas de formats dans la chaîne, vous pouvez utiliser puts (ou fputs ) :

puts("hello%");

s'il y a un format dans la chaîne :

printf("%.2f%%", 53.2);

Comme indiqué dans les commentaires, puts ajoute un \n à la sortie et fputs ne le fait pas.

5 votes

Il convient également de mentionner fputs(), car il est directement lié à fprintf().

1 votes

Ajoute également un saut de ligne [même si vous en avez déjà un]. Si vous voulez cela, tant mieux. Sinon...

0 votes

@Sinan Ünür : merci de me rappeler de puts . Je n'ai jamais pensé à puts pour l'impression de chaînes de caractères et a sauté directement à printf . Plus maintenant.

11voto

martin clayton Points 41306

Avec lui-même...

printf("hello%%"); /* like this */

7voto

pmg Points 52636

Pique-nique :
Vous ne pouvez pas vraiment échapper à la % dans la chaîne de caractères qui spécifie le format du printf() (et scanf() ) de la famille de fonctions.

El % dans le printf() (et scanf() ), lance une spécification de conversion. L'une des règles de spécification de la conversion stipule qu'une fonction % comme spécificateur de conversion (immédiatement après le % qui a lancé la spécification de conversion) provoque un '%' caractère à écrire, sans argument converti.

La chaîne vraiment a 2 '%' à l'intérieur (par opposition à l'échappement des caractères : "a\bc" est une chaîne de 3 caractères non nuls ; "a%%b" est une chaîne de 4 caractères non nuls).

2 votes

Techniquement, il s'agit toujours d'un "échappement" ; les caractères spéciaux ont besoin d'un moyen pour "échapper" à leur signification spéciale et retrouver leur "nature de caractère".

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