Wie entkommen Sie dem %-Zeichen bei der Verwendung von printf
in C?
printf("hello\%"); /* not like this */
Chris_45
Wie entkommen Sie dem %-Zeichen bei der Verwendung von printf
in C?
printf("hello\%"); /* not like this */
Pablo Santa Cruz
Sie können es umgehen, indem Sie ein doppeltes ‘%’ wie folgt posten: %%
Anhand deines Beispiels:
printf("hello%%");
Das Escaping des ‘%’-Zeichens ist nur für Druckf. 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: %%
“printf(“hallo%%”);” ist richtig. Aber es ist keine Flucht, denke ich. benutze printf(“hello\045”);
– Lai Jiangshan
11. Dezember 2009 um 3:12 Uhr
@Pablo Santa Cruz: diese Methode um zu “entkommen” %
ist spezifisch für printf
Korrekt?
– Laser
27. März 2010 um 12:20 Uhr
Dies ist ein Spezialfall der sehr verbreiteten Regel in Escape-Systemen, dass Sie
– dmckee — Ex-Moderator-Kätzchen
1. Juli 2010 um 14:49 Uhr
Lai Jiangshan, das wird nicht funktionieren. \045
ist Kompilierzeit-Escape, das Teil von ist Sprache und wird sich verwandeln %
wenn kompiliert. printf
ist eine Laufzeitfunktion, also verarbeitet sie Bytes Ihres Strings, nicht C-Quellcode, und sie hat ihre eigenen Escape-Sequenzen, die Teile von sind Funktion. Zusamenfassend, 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);
.
– Triang3l
7. Mai 2013 um 14:23 Uhr
Außerdem können Sie Folgendes tun: printf("hello%c", '%');
. Jedoch, %%
ist besser, weil es kein anderes Argument verwendet.
– Triang3l
7. Mai 2013 um 14:28 Uhr
Mikeage
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, Segmentierungsfehleretc.).
Die Warnung ist im Allgemeinen angemessen, es kann jedoch Situationen geben, in denen Sie “dies” tun möchten – solange Sie wissen, dass die von Ihnen angegebene Zeichenfolge als Formatzeichenfolge interpretiert wird.
– PP.
7. Dezember 2009 um 14:17 Uhr
Ich habe mir einmal eine alternative Lösung ausgedacht – kopieren Sie den Puffer in einen anderen Puffer und gehen Sie dann durch, indem Sie die %-Zeichen verdoppeln. Irgendwann bin ich auf diese Idee gestoßen und habe eine 20-30 Zeilen Funktion durch eine Zeile ersetzt. Keine Sorge, ich habe mich hart an den Kopf geschlagen, wie ich es verdient habe.
– Graem Perrow
7. Dezember 2009 um 14:19 Uhr
Es ist so viel einfacher Puts( c ) zu machen. Wenn
– William Pursel
7. Dezember 2009 um 14:48 Uhr
puts fügt einen Zeilenumbruch an. Das ist oft unerwünschtes Verhalten.
– Mikeage
8. Dezember 2009 um 10:51 Uhr
@Mikeage: Wenn unerwünscht, tun fputs(string, stdout);
oder printf("%s", string);
– Jonas Kölker
2. November 2015 um 15:00 Uhr
Sinan Ünür
Wenn die Zeichenfolge keine Formate enthält, können Sie verwenden puts
(oder fputs
):
puts("hello%");
wenn es ein Format in der Zeichenfolge gibt:
printf("%.2f%%", 53.2);
Wie in den Kommentaren angemerkt, puts
hängt a an \n
zum Ausgang u fputs
nicht.
Erwähnenswert ist auch fputs(), da es direkt zu fprintf() reziprokiert.
– Tim Post
8. Dezember 2009 um 5:55 Uhr
puts fügt auch einen Zeilenumbruch an [even if you already have one]. Wenn du das willst, super. Andernfalls…
– Mikeage
8. Dezember 2009 um 10:51 Uhr
@Sinan Ünür: Danke, dass du mich daran erinnerst puts
. Ich habe nie daran gedacht puts
zum Drucken von Strings und direkt zu gesprungen printf
. Nicht mehr.
– Laser
24. März 2010 um 17:03 Uhr
Mit sich selbst…
printf("hello%%"); /* like this */
Nitpick:
Dem entkommt man nicht wirklich %
in der Zeichenfolge, die das Format für die angibt printf()
(und scanf()
) Funktionsfamilie.
Das %
in dem printf()
(und scanf()
)-Funktionsfamilie, startet eine Konvertierungsspezifikation. Eine der Regeln für die Konvertierungsspezifikation besagt, dass a %
als Konvertierungsbezeichner (unmittelbar nach der %
die die Konvertierungsspezifikation gestartet hat) verursacht a '%'
Zeichen, das ohne umgewandeltes Argument geschrieben werden soll.
Die Saite Ja wirklich hat 2 '%'
Zeichen innerhalb (im Gegensatz zu Escape-Zeichen: "a\bc"
ist eine Zeichenfolge mit 3 Nicht-Null-Zeichen; "a%%b"
ist eine Zeichenfolge mit 4 Nicht-Null-Zeichen).
technisch ist es immer noch “entkommen”; Besondere Charaktere brauchen einen Weg, um ihrer besonderen Bedeutung zu „entkommen“ und zu ihrer „Charakternatur“ zurückzukehren.
– Shin Takezou
1. Juli 2010 um 8:29 Uhr
Salmann A
So was:
printf("hello%%");
//-----------^^ inside printf, use two percent signs together
technisch ist es immer noch “entkommen”; Besondere Charaktere brauchen einen Weg, um ihrer besonderen Bedeutung zu „entkommen“ und zu ihrer „Charakternatur“ zurückzukehren.
– Shin Takezou
1. Juli 2010 um 8:29 Uhr
Peter Mortensen
Verwenden ein doppelt %%
:
printf("hello%%");
"hello\%"
funktioniert nicht, weil es die Zeichenfolge erzeugthello%
plus NUL genauso wie"hello%"
tut.– Ikegami
17. Februar 2021 um 5:53 Uhr
"hello\%"
funktioniert nicht, weil … für mich … es nicht kompiliert. Ich habe Microsoft Visual Studio 2017 verwendet. Die Kompilierung schlägt mit der Meldung fehl:'%': unrecognized character escape sequence.
– Dschibril NDIAYE
12. April 2021 um 16:46 Uhr
@DjibrilNDIAYE Es scheint, dass Clang und GCC ihre Gründe hatten, gegen den Standard zu verstoßen und zuzulassen
\%
.– Ruud Heldermann
15. September um 13:10 Uhr