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.