Wie entkomme ich dem% (Prozent) -Zeichen in Cs printf?


274

Wie entgeht man dem% -Zeichen bei Verwendung printfin C?

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

Antworten:


421

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: %%


8
"printf (" hallo %% ");" ist richtig. Aber ich denke, es ist keine Flucht. benutze printf ("hallo \ 045");
Lai Jiangshan

1
@Pablo Santa Cruz: Diese Methode zum "Entkommen" %ist spezifisch für printf, richtig?
Lazer

10
Dies ist ein Sonderfall der sehr häufigen Regel in Escape-Systemen, dass Sie <Escape-Symbol> <Escape-Symbol> verwenden, um ein wörtliches Escape-Symbol zu erhalten.
dmckee --- Ex-Moderator Kätzchen

12
Lai Jiangshan, das wird nicht funktionieren. \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);.
Triang3l

5
Sie können dies auch tun : printf("hello%c", '%');. Ist %%jedoch besser, weil es kein anderes Argument verwendet.
Triang3l

36

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.]


Die Warnung ist im Allgemeinen angemessen, es kann jedoch Situationen geben, in denen Sie "dies" tun möchten - sofern Sie wissen, dass die von Ihnen angegebene Zeichenfolge als Formatzeichenfolge interpretiert wird.
PP.

2
Ich habe einmal eine alternative Lösung gefunden - kopieren Sie den Puffer in einen anderen Puffer und gehen Sie ihn dann durch, indem Sie die% -Zeichen verdoppeln. Ich bin schließlich auf diese Idee gestoßen und habe eine 20-30-Zeilen-Funktion durch eine Zeile ersetzt. Keine Sorge, ich habe mich heftig um den Kopf geschlagen, wie ich es verdient hatte.
Graeme Perrow

Stimmt, aber vergessen Sie nicht, dass Sie in 99% der Fälle, wenn Sie eine Formatzeichenfolge erhalten, die Argumente als va_list erhalten, sodass Sie vprintf verwenden müssen. Somit bin ich technisch korrekt;)
Mikeage

2
Es ist so viel einfacher, Puts zu machen (c). If
William Pursell

1
setzt eine neue Zeile an. Das ist oft unerwünschtes Verhalten.
Mikeage

33

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.


4
Erwähnenswert ist auch fputs (), da es direkt zu fprintf () wechselt.
Tim Post

1
Puts fügt auch eine neue Zeile hinzu [auch wenn Sie bereits eine haben]. Wenn du das willst, großartig. Ansonsten ...
Mikeage

@ Sinan Ünür: Danke, dass du mich daran erinnert hast puts. Ich habe nie daran gedacht, putsStrings zu drucken und bin direkt zu gesprungen printf. Nicht länger.
Lazer


7

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).


2
technisch gesehen "entkommt" es immer noch; Charaktere, die etwas Besonderes sind, brauchen einen Weg, um ihrer besonderen Bedeutung zu "entkommen" und zu ihrer "Charakter-Natur" zurückzukehren
ShinTakezou


4

So was:

printf("hello%%");
//-----------^^ inside printf, use two percent signs together

3

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.




2

Ja, benutze printf ("hallo %%"); und es ist geschafft.


2

Sie können einfach %zweimal verwenden, das heißt"%%"

Beispiel:

printf("You gave me 12.3 %% of profit");

1

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 *% ""

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.