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?
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' }
).
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'
istNUL
(mit nur einem L).– Shahbaz
30. November 2013 um 14:28 Uhr