Réponses:
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: %%
%est spécifique à printf, n'est -ce 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);.
printf("hello%c", '%');. Cependant, %%c'est mieux car il n'utilise pas d'autre argument.
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.]
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.
puts. Je n'ai jamais pensé putsà imprimer des cordes et j'ai sauté directement dessus printf. Plus maintenant.
Avec lui-même ...
printf("hello%%"); /* like this */
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).
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%.
Vous pouvez utiliser %%:
printf("100%%");
Le résultat est:
100%
vous utilisez un spécificateur de format incorrect que vous devez utiliser %%pour l'impression %. Votre code doit être:
printf("hello%%");
En savoir plus tous les formats utilisés dans spécificateurs C .
Vous pouvez simplement utiliser %deux fois, c'est-à-dire"%%"
Exemple:
printf("You gave me 12.3 %% of profit");
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 *% "