Problem c-string



  • Hallo!
    Leider habe ich überhaupt keine Ahnung und Erfahrung mit c. Der folgende Beispielcode beschreibt, denke ich, mein Problem ganz gut.

    #include <cstring>
    
    class MyClass
    {
        private:
           char* name;
    
        public:
           MyClass(const char* c)
           {
              // Wie jetzt speicher reservieren und name c zuweisen?
              // strncpy(name, c, ???)?
           }
    }
    

    Oder wäre es sinnvoll c++ Strings zu verwenden? Einerseits kann ich so noch etwas lernen...

    Danke und Gruß, Vanish



  • Hi

    #include <string>
    
    class MyClass
    {
        private:
           std::string name;
    
        public:
           MyClass(const char* c) : name(c) { }
    }
    

    benutze immer std::string in C++ und nicht die C-Strings

    Mfg



  • Das Problem ist halt, dass man mit C-Strings (also char -Arrays) genau aufpassen muss, was man tut. Man schreibt damit in ungültige Speicherbereiche, ehe man sich versieht.

    Bei deinem Beispiel müsstest du zuerst mit new Speicher für name anfordern und dann diesen Speicher mit strcpy() oder strncpy() füllen. Genauere Beschreibungen zu diesen Funktionen erhältst du auf www.cplusplus.com - eine ziemlich gute Referenz für C++. Im Destruktor müsstest du dann mit delete wieder den Speicher freigeben. Eventuell müsstest du auch noch den Kopierkonstruktor und Zuweisungsoperator anpassen - also unterschätz den Aufwand mit char* nicht 😉

    Aber wie du gesagt hast, die C-Strings sollte man besser nur als Übung verwenden. In C++ gibt es die Klasse std::string , die man viel einfacher handhaben kann (z.B. durch Zuweisungsoperator). Diese würde ich auch in Zukunft nutzen.



  • Man kann auch std::string wie ein char-array verwenden...

    std::string myString;
    strcpy(&myString[0], "Hello World");
    

    lg



  • string-fan schrieb:

    Man kann auch std::string wie ein char-array verwenden...

    Nein, kann man nicht. Auch dann nicht, wenn man vorher sicherstellt, dass der Inhalt des Strings lang genug ist.



  • MFK schrieb:

    string-fan schrieb:

    Man kann auch std::string wie ein char-array verwenden...

    Nein, kann man nicht. Auch dann nicht, wenn man vorher sicherstellt, dass der Inhalt des Strings lang genug ist.

    Naja ... "können" kann man schon. Aber das Ergebnis sollte einem egal sein ... 😉

    Gruß,

    Simon2.



  • string-fan schrieb:

    Man kann auch std::string wie ein char-array verwenden...

    std::string myString;
    strcpy(&myString[0], "Hello World");
    

    lg

    Sowas in einem Thread zu posten, wo Anfängerfragen besprochen werden, ist gemein. Diejenigen könnten nämlich auf die Idee kommen, solchen bullshit tatsächlich zu verwenden...

    Da fehlt n großes Schild dran:
    Don't try this at home!



  • Danke für die Antworten! Etwas spät, war aber viel beschäftigt.

    Dachte die ganze Zeit, ich muss irgendwie mit malloc speicher anfordern. Aber auf new bin ich nicht gekommen, aber klar, ist ja c++. Manchmal wäre es wohl sinnvoller gewesen, erst c zu lernen.

    Zurück zu meiner Frage.

    #include <cstring>
    
    class MyClass
    {
        private:
           char* name[];
    
        public:
           MyClass(const char* c)
           {
              name = new char[strlen(c) + 1];
              strncpy(name, c, strlen(c) + 1)
           }
    }
    

    Verbesserungsvorschläge? (werde schon c++ strings verwenden, bin nur etwas neugierig)

    Ansonsten vielen Dank für die tolle Hilfe,
    Gruß Vanish



  • Verbesserungsvorschläge? (werde schon c++ strings verwenden, bin nur etwas neugierig)

    - Wo gibst du das ganze wieder frei?
    - Was passiert, wenn du MyClass kopierst?
    - Was passiert, wenn du MyClass einem anderen Objekt zuweist?
    - Was passiert, wenn new bad_alloc wirft?

    Da kann also noch recht viel schiefgehen.



  • pumuckl schrieb:

    string-fan schrieb:

    Man kann auch std::string wie ein char-array verwenden...

    std::string myString;
    strcpy(&myString[0], "Hello World");
    

    lg

    Sowas in einem Thread zu posten, wo Anfängerfragen besprochen werden, ist gemein. Diejenigen könnten nämlich auf die Idee kommen, solchen bullshit tatsächlich zu verwenden...

    Da fehlt n großes Schild dran:
    Don't try this at home!

    Das darf man und ist auch absolut legal. std::string und std::vector sind nämlich "c-kompatibel". Da std::string die Stringlänge nicht an einer terminierenden 0 festmacht stört eine 0 mitten im String auch nicht.
    Die Ausgabe auf einen std::ostream ist auch kein Problem.

    Ich sage nicht, dass diese Art der Stringmanipulation gut ist, aber falsches korrigiere ich halt 😃



  • class MyClass
    {
    private:
    	char* name;
    
    public:
    	explicit MyClass( const char* c = "" ) 
    	try 
    	: name( new char[ std::char_traits< char >::length( c )+1 ] )
    	{
    	  Initialize( c );
    	}
    	catch ( ... )
    	{
    	  std::cerr << "MyClass::c'tor failed";
    	  throw;
    	}
    
    	MyClass( const MyClass& other )
    	try 
    	: name( new char[ std::char_traits< char >::length( other.name )+1 ] )
    	{
    		Initialize( other.name );
    	}
    	catch ( ... )
    	{
    	  std::cerr << "MyClass::copy c'tor failed";
    	  throw;
    	}
    
    	MyClass& operator=( const MyClass& other ) 
    	{
    		MyClass( other ).Swap( *this );
    		return *this;
    	}
    
    	~MyClass()
    	{
    	  delete [] name;
    	}
    
    	const char* Name() const { return name; }
    
    private:
    	void Swap( MyClass& other )
    	{
    		std::swap( name, other.name );
    	}
    
    	void Initialize( const char* str )
    	{
    	  std::char_traits< char >::copy(
    		  name, str, std::char_traits< char >::length( str )+1 );
    	}
    };
    

    💡 :p



  • David_pb schrieb:

    ...

    LOL
    Ich habe mir noch gedacht, ob ich dein Beispiel aus sp.de posten soll, aber dann habe ich gedacht, dass er besser zuerst selber überlegen sollte. 🙂


Anmelden zum Antworten