Wie man dem % (Prozent)-Zeichen in C’s printf entgeht

Lesezeit: 4 Minuten

Benutzeravatar von Chris_45
Chris_45

Wie entkommen Sie dem %-Zeichen bei der Verwendung von printf in C?

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

  • "hello\%" funktioniert nicht, weil es die Zeichenfolge erzeugt hello% 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

Benutzeravatar von Pablo Santa Cruz
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 printfKorrekt?

    – Laser

    27. März 2010 um 12:20 Uhr

  • Dies ist ein Spezialfall der sehr verbreiteten Regel in Escape-Systemen, dass Sie verwenden, um ein wörtliches Escape-Symbol zu erhalten.

    – 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


Benutzeravatar von Mikeage
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

Benutzeravatar von Sinan Ünür
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

Benutzeravatar von Salman A
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

Benutzeravatar von Peter Mortensen
Peter Mortensen

Verwenden ein doppelt %%:

printf("hello%%");

1427240cookie-checkWie man dem % (Prozent)-Zeichen in C’s printf entgeht

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy