Char-pointer gibt mir einige wirklich seltsame Zeichen
Wenn ich den Beispielcode ausführen, die wordLength ist 7 (daher der Ausgang 7). Aber mein char-array bekommt einige wirklich seltsame Zeichen in das Ende.
wordLength = word.length();
cout << wordLength;
char * wordchar = new char[wordLength]; //new char[7]; ??
for (int i = 0; i < word.length(); i++) //0-6 = 7
{
wordchar[i] = 'a';
}
cout << wordchar;
Die Ausgabe: 7 aaaaaaa2222¦¦¦¦¦ÂD╩2¦♀
Gewünschte Ausgabe: aaaaaaa... Was ist der Müll dahinter?? Und wie kam es dazu, da?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie
\0
am Endewordchar
.Der Grund ist, dass C-strings sind null-terminiert.
\0
am Ende dienen diesem Zweck.C-strings sind terminiert mit '\0' - Zeichen markiert deren Ende (im Gegensatz dazu, C++
std::string
speichert nur die Länge erhältlich).Kopieren, die Zeichen zu
wordchar
Sie nicht die Zeichenkette beenden, so, wennoperator<<
Ausgängewordchar
geht es weiter, bis es findet die erste\0
Charakter, der zufällig nach dem Speicherort verweistwordchar
, und in den Prozess es druckt alle Müll-Werte, die zufällig im Speicher zwischen.Um das problem zu beheben, sollten Sie:
\0
- Zeichen am Ende.Immer noch in C++, Sie werden in der Regel nur verwenden möchten
std::string
.Verwenden: -
char * wordchar = new char[wordLength+1]; //1 extra for null character
vor der for-Schleife und
wordchar[i] ='\0'
nach der for-Schleife , C-strings sind null-terminiert.
Ohne diese es hält auf zu drucken, bis es findet das erste null-Zeichen,drucken Sie alle den Müll Werte.
Vermeiden Sie die nachfolgenden null, das ist die Ursache.
In C und C++, wie das gesamte eco-system behandelt die string-Länge ist, dass es davon eine nachgestellte null (
'\0'
oder einfach0
numerisch). Anders ist dies dann zum Beispiel pascal-strings, wo die Erinnerung Darstellung beginnt mit der Zahl, die besagt, wie viele von den nächsten Zeichen umfassen, die bestimmten string.Also, wenn du einen bestimmten string content, was Sie speichern möchten, müssen Sie zuweisen, ein zusätzliches byte für das null zu schleppen. Wenn Sie manipulieren, Speicher-Inhalte, Sie müssen immer im Auge zu behalten, die null zu schleppen und zu bewahren. Ansonsten
strstr
und andere string-manipulation-Funktionen können mutieren, Speicher-Inhalte, wenn Sie laufen aus der Spur und arbeite auf die folgenden Speicher-Abschnitt. Ohne schließende nullstrlen
auch ein Falsches Ergebnis, es zählt auch, bis es trifft auf das erste null.Du bist nicht der einzige, machen diesen Fehler, Sie bekommt oft eine wichtige Rolle in Sicherheits-Verwundbarkeiten und deren exploits. Der exploit nutzt den Nebeneffekt, dass die Funktion gehen Sie off-trail, der zu manipulieren, andere Dinge dann, was ursprünglich beabsichtigt war. Dies ist ein sehr wichtiger und gefährlicher Teil von C.
In C++ (wie man es tagged deine Frage), verwenden Sie besser STL ist
std::string
und STL Methoden anstelle von C-Stil-Manipulationen.