String(Char)Pointer in Array speichern?
-
String_ schrieb:
Also die Kommentare sollen das zeigen was sie ausgegeben wird!
cout<<test_array[0][0]<<endl;//abcd cout<<test_array[0][1]<<endl;//bcd cout<<test_array[0][2]<<endl;//cdEs werden hierbei nicht die einzelnen Buchstaben ausgegeben sondern halt wie bei den Kommentar!
Du hast sogar Glück, dass da überhaupt etwas halbwegs sinvolles rauskommt. Soweit ich weiß, garantiert std::string nicht, dass die Zeichen hintereinander im Speicher angeordnet sind und auch nicht, dass es eine Null-Terminierung gibt.
test_array[0][0] ist vom Typ char* ist und operator<<(ostream&,char*) ist dazu da, eine nullterminierte C-Zeichenkette auszugeben. Das erklärt Deine Beobachtung. Du hast das Dereferenzieren der Zeiger vergessen:
cout<< *test_array[0][0] <<endl; // a cout<< *test_array[0][1] <<endl; // b cout<< *test_array[0][2] <<endl; // cTipp: Je weniger Du von Deinem Problem verrätst, was Du lösen willst, desto weniger kann Dir geholfen werden. Es ist offensichtlich, dass Du mit dem Umgang von C-Zeichenketten, std::string und Zeigern nicht sicher bist. Ich halte es daher für sehr wahrscheinlich, dass Du das, was du eigentlich erreichen willst, viel zu umständlich angehst.
Gruß,
SP
-
Hallo,
Also erstmal danke für die schnellen Antworten!
Soweit ich weiß ist bei std::string immer eine Null terminierung aber ich kann mich auch täuschen.Mir war nur nicht klar warum es zu diesen Output kam, jetzt is es mir klar!
Grundsätzlich wollte ich folgendes machen:Das test_array[höhe][breite] sollte ein Spielfeld darstellen, und in diesem Array sollen dann die Pointer von den Buchstaben gesetzt werden.
Diese Buchstaben sollen eine Spielfigure ergeben.
Aber da meine Spielfiguren sowieso aus einen Buchstaben bestehen, werde ich char[2] Array(Buchstabe+ Null) verwenden.mfg
-
Soweit ich weiß ist bei std::string immer eine Null terminierung aber ich kann mich auch täuschen.
Du täuschst dich.
Nur bei der Memberfunktion c_str() ist das terminierende 0 garantiert.
Simon
-
ok thx!
-
theta schrieb:
Soweit ich weiß ist bei std::string immer eine Null terminierung aber ich kann mich auch täuschen.
Du täuschst dich.
Nur bei der Memberfunktion c_str() ist das terminierende 0 garantiert.
Simonfalsch, es ist auch beim
operator[] (size_type i) constfür i == size() garantiert, dass 0 zurückgegeben wird...bb
-
Und wie kann ich jetzt sicherstellen das mein string 0 Terminiert ist, ohne den string mittels c_str zu konvertieren?
mfg
-
1. wozu brauchst du das denn?
2. hab ich doch gerade geschrieben, dass der op[] dieses verhalten in der const-Version erfüllt - in der non-const Version ist das Verhalten nicht definiert...bb
-
String_ schrieb:
Und wie kann ich jetzt sicherstellen das mein string 0 Terminiert ist, ohne den string mittels c_str zu konvertieren?
Du musst das gar nicht sicherstellen. Wenn du einen C-String über
c_str()holst, ist eine Nullterminierung garantiert. Und ausser für C-Strings brauchst du ja keine Nullterminierung...
-
Nachtrag:
21.3.4 basic_string element access schrieb:
const_reference operator[] (size_type pos) const;
reference operator[] (size_type pos);Returns: If
pos < size(), returns*(begin() + pos). Otherwise, ifpos == size(), the const version returnscharT(). Otherwise, the behavior is undefined.bb
-
@unskilled: habs auch gerade gesichtet im Standard.
-
1.Wollte nur wissen ob es noch andere Möglichkeiten gibt.
-
Warum legst Du überhaupt ein Array von Array von Zeigern an? Was bringen Dir die Zeiger?
-
String_ schrieb:
1.Wollte nur wissen ob es noch andere Möglichkeiten gibt.
Also
c_str()undop[]bietet dir das an...
Außerdem gibt es aber noch viel bessere Wege, wo es ganz egal, ob der string so etwas wie ne Nullterminierung bietet:
const_iterator/iterator,begin/end(bzw. diereverse-varianten, wenn du rückwärts gehen möchtest) - google-Stichwort hierzu wäre "Iterator"
Und wenn du unbedingt mit indizes arbeiten möchtest, dann hättest du auch noch die Variante:std::string my_string("asdkgasdjkadlkajsdlJ"); for(std:string::size_type i(0), e(my_string.size()); i != e; ++i) { std::cout << my_string[i]; //oder was auch immer du hier machen möchtest... }Aber jetzt sag doch bitte endlich mal, wieso du denkst, dass du das brauchst!? und wieso du allg. so komische Dinge machst^^
bb