Was bedeutet das symbol \0 bedeuten, in einem string-literal?
Betrachten Sie folgenden code:
char str[] = "Hello\0";
Was ist die Länge von str-array, und mit wie viel 0s ist es Ende?
- Martirosyan: Sie müssen wissen, über C wie gut, oder sind Sie nur daran interessiert, die Antwort für C++?
- Bailey habe ich mich hauptsächlich mit C++, aber ich möchte natürlich wissen, gibt es einen Unterschied zwischen C und C++ . Das ist, warum ich add C++ - tag.
- Wenn Sie gerade tag es mit C, dann Leute, die nur wissen, C beantworten können. Wenn Sie die Markierung mit C und C++, begrenzen Sie die Menge der Leute, die Antworten können nur diejenigen, die verstehen, die subtilen Unterschiede zwischen den beiden Sprachen. Tagging etwas mit beiden Sprachen sollte nur durchgeführt werden, wenn die Frage wirklich nicht verlangen, dass die Ebene der Wissens-und know-how-ein Verständnis für die subtilen Unterschiede zwischen den beiden Sprachen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
sizeof str
7 - fünf bytes für die "Hallo" - text, plus die explizite NUL-terminator, plus die implizite NUL-terminator.strlen(str)
5 - die fünf "Hallo" bytes.Der Schlüssel hier ist, dass die implizite nul-terminator ist immer Hinzugefügt - auch wenn das string-literal passiert einfach zu Ende mit
\0
. Natürlichstrlen
nur Stoppt an der ersten\0
- es kann den Unterschied nicht erkennen.Es ist eine Ausnahme von der impliziten NUL terminator Regel - wenn Sie die explizite Angabe der array-Größe, wird die Zeichenfolge abgeschnitten:
Dies ist jedoch nur selten sinnvoll, und neigen zur Fehleinschätzung der Länge der Zeichenfolge und enden mit einer unterminated string. Es ist auch verboten in C++.
char [8]
Beispiel scheint falsch. Wenn die OP verwendet hattechar str[8] = { 'H', 'e', 'l', 'l', 'o', '\0', '\0' }; the remaining character's value would _not_ be undefined, it would be zero (so that you can sanely initialize, e.g.
int arr[100] = { 0 }", um alle null sein). Ich verstehe nicht, warum es anders sein für"Hello\0"
als es für die lange form, es sei denn, der standard explizit eine Ausnahme für diesen Fall (das wäre sehr seltsam für mich.)Die Länge des Arrays ist 7, die NUL-Zeichen
\0
zählt immer noch als ein Zeichen und die Zeichenfolge ist immer noch beendet mit einem impliziten\0
Sehen diesen link zu sehen, ein Beispiel
Beachten Sie, dass hatte Sie erklärt
str
alschar str[6]= "Hello\0";
die Länge wäre 6, da die implizite NUL wird nur Hinzugefügt, wenn es passt (was es nicht kann in diesem Beispiel.)Beispiele
sizeof
- operator gibt 7.C
Volksmund hat verschiedene Bedeutungen für Länge und Größe mit Bezug auf Saiten. Meine Antwort bezog sich auf die letzteren.Hämmern meine üblichen drum-solo von PROBIEREN Sie ES EINFACH, hier ist, wie können Sie Fragen beantworten wie die, die in der Zukunft:
... eliding die unnötigen Teile ...
...
...
Beachten Sie hier, wie Sie die Zeichenfolge, die ich verwendet für printf ist nur
"-->%s<---\n"
während der Globale string besteht aus zwei teilen:"Hello"
und""
. Der GNU-assembler endet auch strings mit einem implizitenNUL
Charakter, also die Tatsache, dass die erste Zeichenfolge (.LC0) ist in diesen beiden teilen weist darauf hin, dass es zweiNUL
s. Der string ist damit 7 Byte lang. In der Regel, wenn Sie wirklich wollen, zu wissen, was der compiler tut, mit einem bestimmten Stück code, zu isolieren, es in ein dummy-Beispiel wie dieses, und sehen, was es tut mit-S
(für GNU -- MSVC hat ein flag, auch für assembler-Ausgabe, aber ich kenne es nicht aus der hand). Sie lernen eine Menge darüber, wie Ihr code funktioniert (oder nicht funktioniert, wie der Fall sein kann) und du bekommst schnell eine Antwort, dass ist 100% garantiert, um zu passen die Werkzeuge und die Umgebung, in der Sie arbeiten.Speziell möchte ich erwähnen, eine situation, durch die Sie zu verwirren können.
Was ist der Unterschied zwischen "\0" und ""?
Die Antwort ist, dass
"\0"
stellt in der Reihe ist{0 0}
und""
ist{0}
.Weil
"\0"
ist immer noch ein string-literal, und es wird auch hinzufügen"\0"
am Ende. Und""
leer ist, sondern auch"\0"
.Verständnis dieser wird Ihnen helfen zu verstehen
"\0"
tief.Lassen Sie uns herausfinden:
Das wären dann 7 bytes.
In Erinnerung wäre es:
Edit:
Was bedeutet das \0-symbol bedeutet in einen C-string?
Es ist das "Ende" einer Zeichenkette. Ein null-Zeichen. In Speicher, es ist eigentlich eine Null. In der Regel Funktionen zum verarbeiten von char-arrays Blick für diesen Charakter, da dies das Ende der Nachricht. Ich werde ein Beispiel am Ende.
Was ist die Länge von str-array? (Beantwortet, bevor Sie das Teil Bearbeiten)
7
und mit wie viel 0s es zu Ende geht?
Sie array hat zwei "Räume" mit null; str[5]=str[6]='\0'=0
Extra Beispiel:
Angenommen, Sie haben eine Funktion druckt den Inhalt des text-array.
Man könnte es definieren als:
Nun, Sie könnte sich ändern, der Inhalt des Arrays (werde ich nicht in die details, wie), so dass es enthält die Botschaft: "Das ist nur ein Druck-test"
Im Speicher haben, sollten Sie etwas wie:
So drucken Sie das char-array. Und dann wollen Sie eine neue Nachricht. Sagen wir nur "Hallo"
Beachten Sie die 00 auf str[5]. Das ist, wie die print-Funktion wird wissen, wie viel es eigentlich braucht, zu senden, trotz der tatsächlichen Länge des Vektors und der ganze Inhalt.
str
ist ein array der Größe 7, einschließlich der akzeptierten Antworten von vor sieben Jahren. Warum wiederholen Sie es noch einmal (ohne etwas neues)?