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?
\045
ist ein Escape zur Kompilierungszeit, der Teil der Sprache ist und sich %
beim Kompilieren in verwandelt . printf
ist eine Laufzeitfunktion, behandelt also Bytes Ihrer Zeichenfolge, nicht C-Quellcode, und verfügt über eigene Escape-Sequenzen, die Teil der Funktion sind . Kurz gesagt, printf
ist 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, puts
wird ein \n
an die Ausgabe angehängt und fputs
nicht.
puts
. Ich habe nie daran gedacht, puts
Strings 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 *% ""