Komische Effekte mit vector



  • Moin Moin ...
    Ich bin neu hier weiß deshalb nicht ganz ob ich im richtigen Forum bin.
    Aber da ich unter Linux arbeite und hier sonst kein gcc spezifisches Forum sehe,
    denk ich mal das ich hier zumindest nicht ganz falsch bin.

    Also erstmal mein Quelltext:

    #include <iostream>
    #include <cstdio>
    #include <vector>
    
    using namespace std;
    
    vector<char*> stuff;
    
    void addstring(char *str) {
    
    	char *str2;
    	str2 = new char[strlen(str)];
    
    	strcpy(str2,str);
    
    	printf("before : '%s' length : %d\n",str2,strlen(str2));
    	stuff.push_back(str2);
    	printf("after : '%s'  length : %d\n",
    		stuff.at(stuff.size()-1),
    		strlen(stuff.at(stuff.size()-1)));
    }
    
    int main() {
    
    addstring("some_stuff123456789"); // after ... length : 19
    addstring("some_stuff1234567890"); // after ... length : 21 -> should be 20.	
    addstring("some_stuff12345678901"); // after ... length : 21 
    
    return 0;
    }
    

    Das ganze is eigentlich in einem größeren Projekt von mir drin,
    aber ich hab es auf das Wesentliche beschenkt, was ich brauche um das Problem zu reproduzieren.

    Wenn ich das ganze compiliere und laufen lasse bekomme ich diese Ausgabe :

    before : 'some_stuff123456789' lenght : 19
    after : 'some_stuff123456789'  lenght : 19
    before : 'some_stuff1234567890' lenght : 20
    after : 'some_stuff1234567890'  lenght : 21
    before : 'some_stuff12345678901' lenght : 21
    after : 'some_stuff12345678901'  lenght : 21
    

    Man beachte den Längenunterschied des Strings in Zeile 3 und 4.
    Irgendwie ist der C-string im Vektor um ein Zeichen länger. 😮
    Aber das kann irgendwie nicht sein, weil ja beides Pointer auf die selbe
    Stelle sind.

    Oder bin ich da jetzt komplett auf dem falschen Dampfer ?

    Jedenfalls hab ich jetzt schon ein-zwei Jahre Programmiererfahrung,
    aber sowas ist mir bis jetzt noch nicht unter gekommen.
    Vor allem es geht auch bei kürzeren und längeren Strings, ohne Probleme.
    Bloß genau 20 Zeichen machen mir Ärger. 😕

    Falls das ein bug in der vector-Klasse ist, wie und wem sollte man das melden ?

    Vielen Dank im Vorraus
    lhh



  • Also, ich hätte Dir gerne geholfen, aber die Ausgabe bei mir lautet:

    before : 'some_stuff123456789' length : 19
    after : 'some_stuff123456789'  length : 19
    before : 'some_stuff1234567890' length : 20
    after : 'some_stuff1234567890'  length : 20
    before : 'some_stuff12345678901' length : 21
    after : 'some_stuff12345678901'  length : 21
    

    Ich habe den gcc 3.4.2, aber die Mingw-Version. Ich habe grad keine Lust Linux zu starten.

    Allerdings ist das hier glaube ich nicht richtig:

    str2 = new char[strlen(str)];
    

    Es muss glaube ich so heißen, damit die '\0' noch reinpasst:

    str2 = new char[strlen(str)+1];
    

    Das könnte der Grund sein.

    Ach, und, warum eigentlich nicht std::string? Dann sparst Du Dir den Ärger.



  • Okay dann erstmal danke für die schnelle Hilfe.

    Also das mit dem /0 hab ich kurz nach dem ich hier gepostet hab gemerkt.
    Hab ich wohl gepennt, wie üblich 😃
    Peinlich Peinlich ...

    Naja mit +1 scheint es zu klappen.
    Wahr wohl Glück, dass es sonst ohne geklappt hat und kein segfault kam.

    Vielen Dank#
    LHH



  • Dieser Thread wurde von Moderator/in nman aus dem Forum Linux/Unix in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • LongHairedHacker schrieb:

    ...

    lenght
    

    ...

    und ich dachte immer schon, ich sei der Einzige, der immer diesen Fehler macht... 😉

    Gruß,

    Simon2.



  • um das letzte element eines vectors zu ermitteln gibt es die memberfunktion vector::back() (oder so änhlich.
    Und wie gesagt, würde ich std::strings benutzen.


Anmelden zum Antworten