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

274

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

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

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

Pablo Santa Cruz
quelle
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.]

Mikeage
quelle
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.

Sinan Ünür
quelle
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
10

Mit sich selbst ...

printf("hello%%"); /* like this */
Martin Clayton
quelle
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).

pmg
quelle
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
6

Verwenden Sie ein doppeltes %%

jldupont
quelle
4

So was:

printf("hello%%");
//-----------^^ inside printf, use two percent signs together
Salman A.
quelle
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.

Ralph M. Rickenbach
quelle
3

Sie können %% verwenden:

printf("100%%");

Das Ergebnis ist:

100%

Donald Duck
quelle
3

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 .

Pankaj Prakash
quelle
2

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

Kevin
quelle
2

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

Beispiel:

printf("You gave me 12.3 %% of profit");
Md Shahriar
quelle
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 *% ""

Dindea
quelle