Antworten:
Sie können dem entkommen, indem Sie ein doppeltes '%' wie folgt veröffentlichen: %%
Anhand Ihres Beispiels:
printf("hello%%");
Das Escapezeichen '%' gilt nur für printf. Wenn Sie tun:
char a[5];
strcpy(a, "%%");
printf("This is a's value: %s\n", a);
Es wird gedruckt: This is a's value: %%
%ist spezifisch für printf, richtig?
\045ist ein Escape zur Kompilierungszeit, der Teil der Sprache ist und sich %beim Kompilieren in verwandelt . printfist eine Laufzeitfunktion, behandelt also Bytes Ihrer Zeichenfolge, nicht C-Quellcode, und verfügt über eigene Escape-Sequenzen, die Teil der Funktion sind . Kurz gesagt, printfist eine "Sprache in einer Sprache" und printf("This is a's value: %s\n", a);liefert das gleiche Ergebnis wie printf("This is a's value: \045\0163\012", a);.
printf("hello%c", '%');. Ist %%jedoch besser, weil es kein anderes Argument verwendet.
Wie andere gesagt haben, wird %% dem% entkommen.
Beachten Sie jedoch, dass Sie dies niemals tun sollten:
char c[100];
char *c2;
...
printf(c); /* OR */
printf(c2);
Wann immer Sie eine Zeichenfolge drucken müssen, drucken Sie sie immer, immer, immer mit
printf("%s", c)
um zu verhindern, dass ein eingebettetes% Probleme verursacht [Speicherverletzungen, Segfault usw.]
Wenn die Zeichenfolge keine Formate enthält, können Sie Folgendes verwenden puts(oder fputs):
puts("hello%");
Wenn die Zeichenfolge ein Format enthält:
printf("%.2f%%", 53.2);
Wie in den Kommentaren angegeben, putswird ein \nan die Ausgabe angehängt und fputsnicht.
puts. Ich habe nie daran gedacht, putsStrings zu drucken und bin direkt zu gesprungen printf. Nicht länger.
Mit sich selbst ...
printf("hello%%"); /* like this */
Nitpick:
Sie entkommen nicht wirklich dem %in der Zeichenfolge, die das Format für die printf()(und scanf()) Funktionsfamilie angibt .
Das %in der printf()(und scanf()) Funktionsfamilie startet eine Konvertierungsspezifikation. Eine der Regeln für die Konvertierungsspezifikation besagt, dass a %als Konvertierungsspezifizierer (unmittelbar nach dem %, mit dem die Konvertierungsspezifikation gestartet wurde) bewirkt, dass ein '%'Zeichen ohne konvertiertes Argument geschrieben wird.
Die Zeichenfolge enthält wirklich 2 '%'Zeichen (im Gegensatz zu Escapezeichen: "a\bc"ist eine Zeichenfolge mit 3 Nicht-Null-Zeichen; "a%%b"ist eine Zeichenfolge mit 4 Nicht-Null-Zeichen).
Der Backslash in C wird verwendet, um Zeichen in Zeichenfolgen zu maskieren. Zeichenfolgen würden% nicht als Sonderzeichen erkennen, und daher wäre kein Entkommen erforderlich. Printf ist eine andere Sache: Verwenden Sie %%, um ein% zu drucken.
Sie können %% verwenden:
printf("100%%");
Das Ergebnis ist:
100%
Sie verwenden einen falschen Formatbezeichner, den Sie %%zum Drucken verwenden sollten %. Ihr Code sollte sein:
printf("hello%%");
Lesen Sie mehr alle in C verwendeten Formatspezifizierer .
Sie können einfach %zweimal verwenden, das heißt"%%"
Beispiel:
printf("You gave me 12.3 %% of profit");
Das doppelte '%' funktioniert auch in ".Format (…). Beispiel (mit iDrawApertureMask == 87, fCornerRadMask == 0.05):
csCurrentLine.Format("\%ADD%2d%C,%6.4f*\%",iDrawApertureMask,fCornerRadMask) ;
gibt den gewünschten und erwarteten Wert von (String-Inhalt in) csCurrentLine an;"% ADD87C, 0.0500 *% ""