strlen – die Länge der Zeichenfolge wird manchmal um 1 erhöht

Lesezeit: 2 Minuten

Benutzer-Avatar
Prz3m3k

Ich mache ein paar C-Puzzle-Fragen. In den meisten Fällen finde ich die richtige Antwort, aber damit habe ich Probleme. Ich kenne die richtige Antwort, indem ich den Compiler verwende, aber ich kenne den Grund nicht.

Schau dir mal den Code an:

char c[] = "abc\012\0x34";

Was würde strlen(c) Rückkehr, mit einem Standard-C-Compiler?

Mein Compiler gibt 4 zurück, obwohl ich 3 erwartet hatte.

Was ich dachte ist strlen() würde nach dem ersten Vorkommen von suchen NULL Charakter, aber irgendwie ist das Ergebnis eins mehr als ich erwartet hatte.

Irgendeine Idee warum?

  • NULL ist (ein Makro, das erweitert wird zu) a Nullzeiger konstant. Verwenden Sie es, um auf das Nullzeichen zu verweisen '\0' ist potentiell verwirrend.

    – Keith Thompson

    14. Juni 2013 um 17:48 Uhr

  • Fortsetzung von Keiths Kommentar, der Begriff für '\0' ist NUL (mit nur einem L).

    – Shahbaz

    30. November 2013 um 14:28 Uhr


Benutzer-Avatar
Daniel Fischer

Lass uns schreiben

char c[] = "abc\012\0x34";

mit Einzelzeichen:

char c[] = { 'a', 'b', 'c', '\012', '\0', 'x', '3', '4', '\0' };

Der Erste \0 Sie sehen, ist der Beginn einer oktalen Escape-Sequenz \012 die sich über die folgenden Oktalziffern erstreckt.

Oktale Escape-Sequenzen sind in Abschnitt 6.4.4.4 des Standards (Entwurf N1570) spezifiziert:

Oktal-Escape-Sequenz:
\ Oktalziffer
\ Oktalziffer Oktalziffer
\ Oktalziffer Oktalziffer Oktalziffer

Sie bestehen aus einem umgekehrten Schrägstrich, gefolgt von einer, zwei oder drei Oktalziffern. In Absatz 7 dieses Abschnitts wird der Umfang der oktalen und hexadezimalen Escape-Sequenzen angegeben:

7 Jede oktale oder hexadezimale Escape-Sequenz ist die längste Folge von Zeichen, die die Escape-Sequenz bilden kann.

Beachten Sie, dass die Länge einer oktalen Escape-Sequenz zwar auf höchstens drei oktale Ziffern begrenzt ist (also "\123456" besteht aus fünf Zeichen, { '\123', '4', '5', '6', '\0' }) haben hexadezimale Escape-Sequenzen eine unbegrenzte Länge

Hexadezimal-Escape-Sequenz:
\x Hexadezimalzahl
Hexadezimal-Escape-Sequenz Hexadezimal-Ziffer

und somit "\x123456789abcdef" besteht nur aus zwei Zeichen ({ '\x123456789abcdef', '\0' }).

  • Ich bin sicher, Sie können etwas Trost in Ihren verbleibenden 70.000 Wiederholungen finden.

    – hm

    10. Januar 2013 um 18:14 Uhr


  • @effeffe, das hat das Potenzial, als goldenes Stimmenabzeichen zu enden. Ist das gut genug?

    – Chris

    10. Januar 2013 um 18:15 Uhr

  • @chris Es sieht sicher so aus, als könnte es mir Silber bringen, aber Gold wäre peinlich.

    – Daniel Fischer

    10. Januar 2013 um 18:16 Uhr

  • @DanielFischer, so etwas habe ich auf SO noch nicht gesehen. Es passt in eine ziemlich gute Nische.

    – Chris

    10. Januar 2013 um 18:18 Uhr

  • @GrijeshChauhan Weil hexadezimale Escape-Sequenzen mit beginnen \xnicht \0xwäre eine hexadezimale Escape-Sequenz '\x34'. Im "...\0x34..."das '\0' ist eine oktale Escape-Sequenz, gefolgt von den drei gewöhnlichen Zeichen 'x', '3' und '4'. Ich weiß nicht, warum hexadezimale Escape-Sequenzen beginnen \x und nicht \0xich nehme an, es ist einfacher zu analysieren, wenn die Art der Escape-Sequenz unmittelbar nach dem umgekehrten Schrägstrich bestimmt wird.

    – Daniel Fischer

    14. Juni 2013 um 17:17 Uhr

1365460cookie-checkstrlen – die Länge der Zeichenfolge wird manchmal um 1 erhöht

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

Privacy policy