In einem Einführungskurs in C habe ich gelernt, dass beim Speichern die Zeichenfolgen \0
am Ende mit Nullzeichen gespeichert werden . Aber was ist, wenn ich eine Zeichenfolge drucken wollte? Sagen Sie, printf("hello")
obwohl ich festgestellt habe, dass dies nicht mit \0
der folgenden Anweisung endet
printf("%d", printf("hello"));
Output: 5
Dies scheint jedoch inkonsistent zu sein, da ich weiß, dass Variablen wie Zeichenfolgen im Hauptspeicher gespeichert werden und ich denke, dass beim Drucken etwas möglicherweise auch im Hauptspeicher gespeichert wird. Warum dann der Unterschied?
);
Was wollen Sie mit diesem Code zeigen, abgesehen davon , dass Ihr Code zumindest fehlt ? Wie haben Sie bewiesen, dass es nicht mit einem endet\0
?Antworten:
Das Null-Byte markiert das Ende einer Zeichenfolge. Es wird nicht in der Länge der Zeichenfolge gezählt und nicht gedruckt, wenn eine Zeichenfolge mit gedruckt wird
printf
. Grundsätzlich teilt das Null-Byte Funktionen mit, die die Zeichenfolgenmanipulation ausführen, wann sie gestoppt werden sollen.Ein Unterschied besteht darin, dass Sie ein
char
Array erstellen, das mit einer Zeichenfolge initialisiert wurde. Die Verwendung dessizeof
Operators spiegelt die Größe des Arrays einschließlich des Nullbytes wider. Zum Beispiel:quelle
printf()
. TBH Ich habe keine Ahnung, wie dasprintf()
funktioniert.printf
Gibt die Anzahl der gedruckten Zeichen zurück.'\0'
wird nicht gedruckt - es signalisiert nur, dass diese Zeichenfolge keine Zeichen mehr enthält. Es wird auch nicht auf die Saitenlänge angerechnethttps://godbolt.org/z/wYn33e
quelle
Ihre Annahme ist falsch. Ihre Zeichenfolge endet in der Tat mit einem
\0
.Es enthält 5 Zeichen
h
,e
,l
,l
,o
und die 0 - Zeichen.Was der "innere"
print()
Aufruf ausgibt, ist die Anzahl der Zeichen, die gedruckt wurden, und das sind 5.quelle
In C sind alle Literalzeichenfolgen wirklich Zeichenarrays, die den Nullterminator enthalten.
Der Nullterminator wird jedoch nicht in der Länge einer Zeichenfolge (Literal oder nicht) gezählt und nicht gedruckt. Drucken stoppt , wenn der Nullabschluss gefunden wird.
quelle
printf
würde außerhalb der Grenzen des Strings, und druckt „random“ oder „Müll“ Zeichen und Rückkehr eines Zahl unterscheidet sich von der Länge der Zeichenfolge. Wenn Sie die Länge der Zeichenfolge bereits kennen, können Sie auch überprüfen, ob das Zeichen an diesem Index'\0'
funktioniert. Dies funktioniert, ist jedoch technisch undefiniert, wenn die Größe des Arrays den Terminator nicht enthält (wie inchar arr[5] = "hello";
, wodurch das nicht hinzugefügt wird Terminator zum Array).char * p = "Hello"; int i = 0; while (p[i] != '\0') { printf("%d: %c", i, p[i]); i++; }
sehen, wie es ausgeführt wird: Es werden Zeilen mit Indizes und der Inhalt dieser Zeile angezeigt . Nach Index 4 findet es das Zeichen 0 und unterbricht die while-Schleife. Dort sehen Sie, dass es ein 0-Zeichen gibt.Alle Antworten sind wirklich gut, aber ich möchte ein weiteres Beispiel hinzufügen, um all diese zu vervollständigen
Für diejenigen, die dies nicht auf Online-GDB ausprobieren möchten, lautet die Ausgabe:
https://linux.die.net/man/3/printf
Ist dies hilfreich, um zu verstehen, was Escape Terminator tut? Es ist keine Grenze für ein char-Array oder eine Zeichenfolge. Es ist der Charakter, der dem Kerl sagt, der -STOP analysiert, (Druck-) Analyse bis hierher.
PS: Und wenn Sie es als Zeichenarray analysieren und drucken
du erhältst:
Dabei ist das Leerzeichen nach double l der Null-Terminator. Wenn Sie jedoch ein char-Array analysieren, wird nur der char-Wert jedes Bytes angezeigt. Wenn Sie eine weitere Analyse durchführen und den int-Wert jedes Bytes ("% d%, char_array [i]) drucken, sehen Sie, dass das Leerzeichen (Sie erhalten die ASCII-Code-int-Darstellung) den Wert 0 hat.
quelle
In
C
functionprintf()
gibt die Anzahl der gedruckten Zeichen zurück,\0
ist einnull
Terminator, der verwendet wird, um das Ende der Zeichenfolge in der Sprache c anzugeben, und es gibt keinen eingebautenstring
Typ abc++
, jedoch muss Ihre Array-Größe mindestens größer sein als diechar
gewünschte Anzahl lagern.Hier ist die ref: cpp ref printf ()
quelle
Sie liegen falsch. Diese Anweisung bestätigt nicht, dass das Zeichenfolgenliteral
"hello"
nicht mit dem abschließenden Nullzeichen endet'\0'
. Diese Anweisung bestätigte, dass die Funktionprintf
Elemente einer Zeichenfolge ausgibt, bis das abschließende Nullzeichen gefunden wird.Wenn Sie ein Zeichenfolgenliteral wie in der obigen Anweisung verwenden, erstellt der Compiler ein Zeichenarray mit der statischen Speicherdauer, das Elemente des Zeichenfolgenliteral enthält.
Also in der Tat dieser Ausdruck
wird vom Compiler wie folgt verarbeitet
Die Aktion der Funktion printf in diesem können Sie sich folgendermaßen vorstellen
Um die Anzahl der im String-Literal "Hallo" gespeicherten Zeichen zu ermitteln, können Sie das folgende Programm ausführen
Die Programmausgabe ist
quelle
Sie müssen zuerst Ihr Konzept löschen. Da es gelöscht wird, wenn Sie sich mit dem Array befassen, zählt der von Ihnen verwendete Druckbefehl nur die Zeichen, die in der Klammer stehen. Es ist in der Array-Zeichenfolge erforderlich, dass es mit \ 0 endet
quelle
Eine Zeichenfolge ist ein Vektor von Zeichen. Enthält die Zeichenfolge, aus der die Zeichenfolge besteht, gefolgt von der speziellen Endzeichenfolge: '\ 0'
Beispiel: char str [10] = {'H', 'e', 'l', 'l', 'o', '\ 0'};
Beispiel: Der folgende Zeichenvektor ist keine Zeichenfolge, da er nicht mit '\ 0' endet.
char str [2] = {'h', 'e'};
quelle