Problem c-string
-
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
newSpeicher fürnameanfordern und dann diesen Speicher mitstrcpy()oderstrncpy()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 mitdeletewieder den Speicher freigeben. Eventuell müsstest du auch noch den Kopierkonstruktor und Zuweisungsoperator anpassen - also unterschätz den Aufwand mitchar*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.