Ausgabe von printf mit Backslash (\012) verstehen

Lesezeit: 4 Minuten

Benutzer-Avatar
Radosław Krasimirow

Können Sie mir bitte helfen, die Ausgabe dieses einfachen Codes zu verstehen:

const char str[10] = "55\01234";
printf("%s", str);

Die Ausgabe ist:

55
34

  • Nur interessiert, warum jemand dies abgelehnt hat ^^

    – dhein

    23. April 2015 um 9:33 Uhr

  • Es ist auch erwähnenswert, dass es so interpretiert wurde, weil Sie eine Zeichenfolge in doppelten Anführungszeichen angegeben haben. Denn wenn Sie es Zeichen für Zeichen hinzugefügt hätten, hätten Sie wählen müssen '\\', '0', '1', '2', '\0', '1', '2', '\012' (was auch die Größe der Zeichentabelle ändert).

    – Toni

    23. April 2015 um 10:05 Uhr


  • Das ist eine dieser lustigen kleinen Fakten über C, die nicht sehr bekannt sind. Dasselbe gilt, wenn Sie eine ganze Zahl schreiben, die mit a beginnt 0wird es automatisch als oktal interpretiert. int i = 012; ist das gleiche wie int i = 10; oder printf("%d\n", 012); Ausgänge 10.

    – Toni

    23. April 2015 um 10:16 Uhr


  • SSDD: die Java-Version

    – Thomas Weller

    23. April 2015 um 11:58 Uhr

  • @hobbs Soweit ich sehen konnte, sprechen nur sehr wenige C-Programmierkurse über Oktale im Allgemeinen … Und um ehrlich zu sein, ist es nicht übermäßig nützlich, warum sollte jemand schreiben wollen 012 Anstatt von 10 oder \012 Anstatt von \n? Und ich weiß, dass Sie wahrscheinlich ein Beispiel finden können, wo es nützlich ist, aber im Allgemeinen?

    – Toni

    24. April 2015 um 8:17 Uhr

Benutzer-Avatar
entspannen

Die Zeichenfolge \012 innerhalb der Zeichenfolge wird als interpretiert oktale Escape-Sequenz. Der Wert 012 als oktal interpretiert wird 10 in Dezimalzahl, das ist der Zeilenvorschub (\n) Zeichen auf den meisten Terminals.

Von der Wikipedia-Seite:

Eine oktale Escape-Sequenz besteht aus \ gefolgt von einer, zwei oder drei Oktalziffern. Die Oktal-Escape-Sequenz endet, wenn sie entweder bereits drei Oktalziffern enthält oder das nächste Zeichen keine Oktalziffer ist.

Da Ihre Sequenz drei gültige Oktalziffern enthält, wird sie so analysiert. Mit dem geht es nicht weiter 3 aus 34da dies eine vierte Ziffer wäre und nur drei Ziffern unterstützt werden.

Sie könnten Ihre Zeichenfolge also schreiben als "55\n34"was deutlicher ist, was Sie sehen, und das portabler wäre, da es den Zeilenumbruch nicht mehr fest codiert, sondern den Compiler etwas Passendes generieren lässt.

  • Können Sie auch hinzufügen, warum es dauert 12 als Oktalzahl und nicht 1 oder 123?

    – dragi

    23. April 2015 um 11:07 Uhr

  • @ Zaibis Was? Auf der Seite heißt es auch: “Beachten Sie, dass einige dreistellige Oktal-Escape-Sequenzen möglicherweise zu groß sind, um in ein einzelnes Zeichen zu passen; dies führt zu einem implementierungsdefinierten Wert für das tatsächlich erzeugte Zeichen.” was relevant sein könnte \777 wenn Sie das meinen (777 Oktal ist 511 Dezimal, was für 8-Bit-Zeichencodierungen außerhalb des Bereichs liegt).

    – abschalten

    23. April 2015 um 11:20 Uhr

Benutzer-Avatar
meinaut

\012 ist ein Fluchtabfolge was darstellt octal Code des Symbols:

012 = 10 = 0xa = LINE FEED (in ASCII)

So sieht Ihre Zeichenfolge aus 55[LINE FEED]34.

LINE FEED Zeichen wird interpretiert als Newline-Sequenz auf vielen Plattformen. Deshalb sehen Sie an einem Terminal zwei Strings.

  • Unter welcher Spezifikation ist das angegeben?

    – dhein

    23. April 2015 um 9:33 Uhr

  • Ich bin noch nie darüber gestolpert, aber es ist in der c99 ISO/IEC:9899. Wenn Sie es hinzufügen möchten: es ist unter 6.4.4.4 Zeichenkonstanten Punkt 3 zu finden und Punkt 9 schränkt die Werte ein.

    – dhein

    23. April 2015 um 9:37 Uhr


  • @Zaibis: Danke für die Anmerkungen. Ich bin mir nicht sicher, ob das Zitieren des Standards meine Antwort für OP klarer macht. Ich würde es vorziehen, den Wikipedia-Link beizubehalten.

    – myaut

    23. April 2015 um 9:41 Uhr

  • @Medionic: Das ist, wie ich gesagt habe, was im Wiki falsch ist. Punkt 9 besagt (wie Sie in meiner Antwort sehen können), dass die Escape-Sequenz auf einen Wert beschränkt ist, der in den Bereich von unsigned char passt. was wäre denn für hex limitiert \xFF und für oktal: \377

    – dhein

    23. April 2015 um 9:47 Uhr


  • @Medionic: Oktalfolgen können je nach Grammatik 1, 2 oder 3 Ziffern haben: c0x.coding-guidelines.com/6.4.4.4.html

    – myaut

    23. April 2015 um 9:50 Uhr

Benutzer-Avatar
dhein

\012 ist eine Escape-Sequenz für neue Zeilen, wie andere bereits gesagt haben. (Was könnte, wie chux absolut richtig kommentiert hat, anders sein, wenn ASCII nicht der verwendete Zeichensatz ist. Aber in dieser Notation ist es sowieso eine Oktalziffer.)

dies ist mit Standard gemeint, wie es für c99 in ISO/IEC 9899 heißt

zum:

6.4.4.4 Zeichenkonstanten

[…]

3 Das einfache Anführungszeichen ‘, das doppelte Anführungszeichen “, das Fragezeichen ?, der Backslash \ und beliebige ganzzahlige Werte sind gemäß der folgenden Tabelle von Escape-Sequenzen darstellbar:

einfaches Anführungszeichen’ \’

doppeltes Anführungszeichen” \”

Fragezeichen? \?

Backslash\ \

Oktalzeichen \Oktalziffern

Hexadezimalzeichen \x Hexadezimalziffern

Und die Reichweite, an die es gebunden ist:

Einschränkungen

9 Der Wert einer oktalen oder hexadezimalen Escape-Sequenz muss im Bereich darstellbarer Werte für den Typ unsigned char für eine ganzzahlige Zeichenkonstante oder den unsigned-Typ entsprechend wchar_t für eine breite Zeichenkonstante liegen.

  • \012 ist eine Escape-Sequenz für neue Zeilen” ist wahr, wenn ASCII verwendet wird, also ist es zu 99,9% der Zeit korrekt, aber dies entspricht nicht der C-Spezifikation.

    – chux – Wiedereinsetzung von Monica

    23. April 2015 um 15:42 Uhr

  • @chux: Ich stimme voll und ganz zu, entschuldige meine Unrichtigkeit, ich werde das beheben, sobald ich die Zeit zum Bearbeiten finde.

    – dhein

    23. April 2015 um 18:35 Uhr

1385600cookie-checkAusgabe von printf mit Backslash (\012) verstehen

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

Privacy policy