Warum werden Strings in C++ normalerweise mit '\0'
terminiert?
Beachten Sie, dass C++ - Zeichenfolgen und C-Zeichenfolgen nicht identisch sind.
In C++ - Zeichenfolge bezieht sich auf std::string, die eine Vorlagenklasse ist und eine Vielzahl von intuitiven Funktionen bietet, um die Zeichenfolge zu behandeln.
Beachten Sie, dass C++ std :: string nicht \0
beendet ist, aber die Klasse bietet Funktionen zum Abrufen der zugrunde liegenden Zeichenfolge Daten als \0
beendet C-Stil-Zeichenfolge.
In C ist eine Zeichenfolge eine Sammlung von Zeichen. Diese Sammlung endet normalerweise mit einer \0
.
Wenn kein spezielles Zeichen wie \0
verwendet wird, gibt es keine Möglichkeit zu wissen, wann eine Zeichenfolge endet.
Es ist auch als String-Null-Terminator bekannt.
Ofcourse, könnte es andere Möglichkeiten der Buchhaltung sein, die Länge der Zeichenfolge zu verfolgen, aber ein Sonderzeichen mit zwei gerade Vorteile:
- Es ist intuitiver und
- Es gibt keine zusätzliche Gemeinkosten
Beachten sie, dass \0
erforderlich ist, weil die meisten Standard-C-Bibliothek Funktionen auf Strings arbeiten vorausgesetzt, sie sind \0
beendet.
Zum Beispiel:
Während printf()
verwenden, wenn Sie eine Zeichenfolge haben, die dann nicht \0
beendet wird printf()
Zeichen stdout
bis ein \0
hält, könnte Müll sogar drucken Sie es kurz begegnet schreibt.
Warum sollten wir '\0'
hier verwenden?
Es gibt zwei Szenarien, wenn Sie nicht brauchen, um \0
kündigen einen String:
- In jeder Nutzung, wenn Sie ausdrücklich Buchhaltung Länge der Zeichenfolge und
- sind Wenn Sie einige Standards verwenden library api fügt implizit eine Zeichenfolge
\0
hinzu.
In Ihrem Fall haben Sie bereits das zweite Szenario für Sie arbeiten.
array[s.size()] = '\0';
Die obige Code-Anweisung ist in Ihrem Beispiel redundant.
Für Ihr Beispiel mit strncpy()
macht es nutzlos. strncpy()
kopiert s.size()
Zeichen zu Ihrem array
, Beachten Sie, dass es einen Nullabschluss anfügt, wenn noch Platz nach dem Kopieren der Zeichenfolgen übrig ist. Da array
von der Größe s.size() + 1
ist, wird automatisch eine \0
hinzugefügt.
cstrings sind normalerweise nicht die beste Idee in C++ - Code –
C-String, der im Wesentlichen ein Char-Array ist, muss NUL terminiert werden. Andernfalls funktionieren die Funktionen in 'string.h' nicht wie erwartet. – nhahtdh
In C sehen Sie das sehr oft. In C++ gibt es wahrscheinlich bessere Möglichkeiten, das Gleiche zu erreichen. – jedwards