String(Char)Pointer in Array speichern?



  • Hallo,

    Folgendes ich hab einen string und von diesen string möchte ich die einzelnen Buchstaben in ein ein array speichern und zwar nur als pointer!

    Beispielcode:

    char* test_array[10][10];
    std::string test_string = "abcd";
    
    test_array[0][0]= &test_string[0];//abcd 
    test_array[0][1]= &test_string[1];//ghl 
    test_array[0][2]= &test_string[2];//cd
    test_array[0][3]= &test_string[3];//d
    

    Wie bekomme ich die Pointer nur von einen Buchstaben hin? Also das in test_array[0][0] der Pointer auf a steht und in test_array[0][1] der Pointer auf b steht usw. ?

    mfg



  • String_ schrieb:

    Folgendes ich hab einen string und von diesen string möchte ich die einzelnen Buchstaben in ein ein array speichern und zwar nur als pointer!

    Na, entweder speicherst Du das Zeichen direkt oder Du speicherst einen Zegier auf das Zeichen. "Buchstaben als Pointer speichern" würde ich nicht sagen.

    String_ schrieb:

    char* test_array[10][10];
    std::string test_string = "abcd";
    
    test_array[0][0]= &test_string[0];//abcd 
    test_array[0][1]= &test_string[1];//ghl 
    test_array[0][2]= &test_string[2];//cd
    test_array[0][3]= &test_string[3];//d
    

    Wie bekomme ich die Pointer nur von einen Buchstaben hin? Also das in test_array[0][0] der Pointer auf a steht und in test_array[0][1] der Pointer auf b steht usw. ?

    Du hast bereits Zeiger auf einzelne Zeichen. Was sollen die Kommentare?

    Versuch mal zu erklären, warum Du das machst. Ich habe das Gefühlt, dass Du C-Zeichenketten, std::string und Zeiger noch nicht 100%ig verstanden hast.

    Gruß,
    SP



  • Ok stimmt ich meinte Zeiger auf Zeichen!

    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;//cd
    

    Es werden hierbei nicht die einzelnen Buchstaben ausgegeben sondern halt wie bei den Kommentar!

    mfg


  • Mod

    String_ schrieb:

    Ok stimmt ich meinte Zeiger auf Zeichen!

    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;//cd
    

    Es werden hierbei nicht die einzelnen Buchstaben ausgegeben sondern halt wie bei den Kommentar!

    Das liegt daran, dass char* von ostream::operator<< als Zeichenketten behandelt werden. Willst du einzelne zeichen, musst du nochmals dereferenzieren.

    P.S: Und du hast Glück, dass der std::string bei dir anscheinend nullterminiert ist, eigentlich würde bei deinem Code der gesamte Speicher bis zum nächsten Nullzeichen ausgegeben werden.



  • 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;//cd
    

    Es 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; // c
    

    Tipp: 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.
    Simon

    falsch, es ist auch beim operator[] (size_type i) const fü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, if pos == size() , the const version returns charT() . 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() und op[] 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. die reverse -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


Log in to reply