Strings in C:
http://de.wikibooks.org/wiki/C-Progr...trings#Strings
http://ivs.cs.uni-magdeburg.de/bs/le...seminar3.shtml
Wenn Du eine einfachere String-Handhabung wünschst, wechselst Du am besten zu C++ und schreibst Dir eine eigene kleine String-Klasse mit dem operator= auf Basis char. Hier einige Vorbilder, da selbst gestrickte String-Klassen erstaunlicherweise nicht leicht zu finden sind:
http://www.c-plusplus.de/forum/viewt...s-estring.html
http://www.c-plusplus.de/forum/viewt...art-is-10.html
http://forum.2lucky.de/archive/o_t__...ingklasse.html
Buch: Till Jeske, C++, Addison-Wesley, aus der Nitty Gritty Reihe (Klasse 'Text' siehe Anhang).
Hier ein bei avr-g++ funktionierendes ausbaufähiges Beispiel:
Code:/***************** * Stringklasse * ******************/ // Ersatz für new, new[], delete und delete[] der fehlenden C++-Standard-Bibliothek void* operator new (size_t size) { return malloc(size); } void* operator new[] (size_t size) { return malloc(size); } void operator delete (void* ptr) { free(ptr); } void operator delete[] (void* ptr) { free(ptr); } class MyString { private: char * pData_; public: friend MyString operator+( const MyString &, const MyString & ); MyString() : pData_( NULL ) {} // inline ctor MyString( const char * pText ); MyString( const MyString & text ); // Copy-Konstruktor ~MyString(); // dtor const MyString & operator=( const MyString & text ); bool operator==( const MyString & text ) const; char operator[]( int index ) const; operator const char * () const; // cast zum C-String operator char * () const; // cast zum C-String int getLaenge() const; void ausgeben() const; }; MyString operator+( const MyString & leftstring, const MyString & rightstring ); /******************************************************************/ // ctor mit C-String als Argument MyString::MyString( const char * pText ) : pData_( NULL ) { if( pText ) { pData_ = new char[ strlen( pText ) + 1 ]; strcpy( pData_, pText ); } } // copy-ctor MyString::MyString( const MyString & text ) : pData_( NULL ) { if( text.pData_ ) { pData_ = new char[ strlen( text.pData_ ) + 1 ]; strcpy( pData_, text.pData_ ); } } // dtor MyString::~MyString() { delete[] pData_; } // == bool MyString::operator==( const MyString & text ) const { if( pData_ == NULL || text.pData_ == NULL ) { return ( pData_ == NULL && text.pData_ == NULL ); } return ( strcmp( pData_, text.pData_ ) == 0 ); } // [] char MyString::operator[]( int i ) const { if( i >= 0 && i < getLaenge() ) { return pData_[i]; } else { return '\0'; } } // Länge des Textes ermitteln int MyString::getLaenge() const { if( pData_ == NULL ) { return 0; } else { return strlen( pData_ ); } } // cast zu C-String MyString::operator const char * () const { return pData_; } // cast zu C-String MyString::operator char * () const { return pData_; } // Zuweisungs-Operator const MyString & MyString::operator=( const MyString & text ) { if( this == &text ) // Selbstzuweisung abfangen { return *this; } delete[] pData_; if( text.pData_ ) { pData_ = new char[ strlen( text.pData_ ) + 1 ]; strcpy( pData_, text.pData_ ); } else { pData_ = NULL; } return *this; } void MyString::ausgeben() const { // TODO } /******************************************************************/ MyString operator+( const MyString & leftstring, const MyString & rightstring ) { MyString result; if( leftstring.pData_ != NULL && rightstring.pData_ != NULL ) { result.pData_ = new char[ strlen( leftstring.pData_ ) + strlen( rightstring.pData_ ) + 1 ]; strcpy( result.pData_, leftstring.pData_ ); strcat( result.pData_, rightstring.pData_ ); } else if( rightstring.pData_ != NULL ) { result = rightstring; } else if( leftstring.pData_ != NULL ) { result = leftstring; } return result; }







Zitieren

Lesezeichen