Das ewige Problem mit den Strings



  • Morgen !

    ich habe eine Klasse mit einem private-Feld und einem Konstruktor

    private: char hase[5];
    Tier_eins(char hase[5]);
    ~Tier_eins();
    

    Dieses Feld kann ausschließlich von außen durch einen Konstruktorenaufruf belegt werden

    Tier_eins("miau");
    

    Das Problem dabei ist, dass ich im Konstruktor auch einen viel längeren String mitgeben kann, der mir dann nachfolgende Speicherbereiche überschreibt.
    Das Ziel wäre also zu garantieren dass der übergebene String eine bestimmte Höchstlänge nicht überschreitet.
    Ob das besser mit char[] oder mit string zu erledigen ist weiß ich leider nicht
    😞 😞



  • Hi,

    du könntest dazu einfach std::string benutzen:

    #include <string>
    
    ...
    private: std::string m_hase;
    Tier_eins(std::string const & hase)
    : m_hase(hase){}
    ~Tier_eins(){}
    ...
    

    MfG



  • Du könntest entweder die Stringklasse von C++ verwenden,
    den Speicherplatz für den String im Konstruktor anfordern
    [/cpp]private: char hase;
    Tier_eins(char
    hase)
    {
    this->hase = new char[strlen(hase)]
    //...
    }
    ~Tier_eins(void)
    {
    delete[] this->hase;
    }

    oder die Stringlänge überprüfen
    private: char hase[5];
    

    Tier_eins(char* hase)
    {
    for(int i=0; i<5&&hase[i]; i++){
    this->hase[i] = hase[i];
    }
    }[cpp]

    Alle Angaben sind wie immer ohne Gewähr...



  • Würde dazu tendieren es mit const char * const zutun auf NULL zu überpruefen und einfach nach dem 4. Zeichen abzuschneiden und \0 dranzusetzen.
    (unter der Voraussetzung dass du wirklich immer nur 4 Zeichen haben möchtest.)

    Ansonsten würde ich dir generel empfehlen durchgängig eine String-Klasse zu verwenden und nicht nur als Parameter. Damit sorgt man nur für fleißige Zeichenkopiererreien.


Anmelden zum Antworten