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

274

Comment échappez-vous au signe% lors de l'utilisation printfen C?

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

Réponses:

421

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

En utilisant votre exemple:

printf("hello%%");

Le signe '%' qui s'échappe est uniquement pour printf. Si tu fais:

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

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

Pablo Santa Cruz
la source
8
"printf (" bonjour %% ");" est correct. Mais ce n'est pas une évasion je pense. utilisez printf ("hello \ 045");
Lai Jiangshan
1
@Pablo Santa Cruz: cette méthode "d'évasion" %est spécifique à printf, n'est -ce pas?
Lazer
10
C'est un cas particulier de la règle très courante dans les systèmes d'échappement selon laquelle pour obtenir un symbole d'échappement littéral, vous utilisez <symbole d'échappement> <symbole d'échappement>.
dmckee --- chaton ex-modérateur
12
Lai Jiangshan, cela ne fonctionnera pas. \045est un échappement au moment de la compilation qui fait partie du langage et se transformera en une %fois compilé. printfest une fonction d'exécution, elle traite donc les octets de votre chaîne, pas le code source C, et elle a ses propres séquences d'échappement qui font partie de la fonction . En bref, printfest une "langue à l'intérieur d'une langue", et printf("This is a's value: %s\n", a);donne le même résultat que printf("This is a's value: \045\0163\012", a);.
Triang3l
5
, Vous pouvez aussi le faire: printf("hello%c", '%');. Cependant, %%c'est mieux car il n'utilise pas d'autre argument.
Triang3l
36

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

Notez cependant que vous ne devriez jamais faire cela:

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

Chaque fois que vous devez imprimer une chaîne, imprimez-la toujours, toujours

printf("%s", c)

pour empêcher un% intégré de causer des problèmes [violations de mémoire, erreur de segmentation, etc.]

Mikeage
la source
L'avertissement est généralement approprié, mais il peut y avoir des situations dans lesquelles vous souhaitez effectuer "ceci" - tant que vous savez que la chaîne que vous fournissez sera interprétée comme une chaîne de format.
PP.
2
J'ai trouvé une autre solution une fois - copiez le tampon dans un autre tampon, puis parcourez-le en doublant les signes%. J'ai finalement trouvé cette idée et remplacé une fonction de ligne 20-30 par une ligne. Ne vous inquiétez pas, je me suis battu sévèrement à la tête, comme je le méritais.
Graeme Perrow
Certes, mais n'oubliez pas que 99% du temps lorsque vous obtenez une chaîne de format, vous obtenez les arguments sous forme de liste_v, vous devez donc utiliser vprintf. Ainsi, je suis techniquement correct;)
Mikeage
2
C'est tellement plus facile de faire des put (c). If
William Pursell
1
met ajoute une nouvelle ligne. C'est souvent un comportement indésirable.
Mikeage
33

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, putsajoute un \nà la sortie et fputsne le fait pas.

Sinan Ünür
la source
4
Il convient également de mentionner fputs (), car il correspond directement à fprintf ().
Tim Post
1
met ajoute également une nouvelle ligne [même si vous en avez déjà une]. Si vous le souhaitez, tant mieux. Sinon ...
Mikeage
@Sinan Ünür: merci de me l'avoir rappelé puts. Je n'ai jamais pensé putsà imprimer des cordes et j'ai sauté directement dessus printf. Plus maintenant.
Lazer
10

Avec lui-même ...

printf("hello%%"); /* like this */
Martin Clayton
la source
7

Nitpick:
Vous n'échappez pas vraiment %à la chaîne qui spécifie le format de la famille de fonctions printf()(et scanf()).

Dans %la famille de fonctions printf()(et scanf()), démarre une spécification de conversion. L'une des règles de spécification de conversion stipule qu'un en %tant que spécificateur de conversion (immédiatement après le %début de la spécification de conversion) entraîne '%'l'écriture d' un caractère sans conversion d'argument.

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

pmg
la source
2
techniquement, il "s'échappe" encore; les personnages spéciaux ont besoin d'un moyen "d'échapper" à leur signification particulière et de retrouver leur "nature de caractère"
ShinTakezou
6

utiliser un double %%

jldupont
la source
4

Comme ça:

printf("hello%%");
//-----------^^ inside printf, use two percent signs together
Salman A
la source
3

La barre oblique inverse en C est utilisée pour échapper les caractères dans les chaînes. Les chaînes ne reconnaîtraient pas% comme un caractère spécial et, par conséquent, aucun échappement ne serait nécessaire. Printf est une autre affaire: utilisez %% pour imprimer un%.

Ralph M. Rickenbach
la source
3

Vous pouvez utiliser %%:

printf("100%%");

Le résultat est:

100%

Donald Duck
la source
2

Oui, utilisez printf ("bonjour %%"); et c'est fait.

Kevin
la source
2

Vous pouvez simplement utiliser %deux fois, c'est-à-dire"%%"

Exemple:

printf("You gave me 12.3 %% of profit");
Md Shahriar
la source
1

Le double '%' fonctionne également dans ".Format (…). Exemple (avec iDrawApertureMask == 87, fCornerRadMask == 0,05): csCurrentLine.Format("\%ADD%2d%C,%6.4f*\%",iDrawApertureMask,fCornerRadMask) ; donne la valeur souhaitée et attendue de (contenu de la chaîne dans) csCurrentLine;"% ADD87C, 0,0500 *% "

dindea
la source