Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Strings verbinden ...

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ]
020
01.06.2005, 11:27 Uhr
(un)wissender
Niveauwart



Zitat von Lumina:

Und das mit dem anderen Zeiger durchlaufen lassen, ist auch eine gute Anmerkung, aber nicht zwingend notwendig für das funktionieren meiner Funktion.



Hm, kommt auf die Sichtweise an. Korrekter Code ist es eigentlich nicht, da die Abwesenheit von const-Korrektheit ein Bug ist. Vielleicht keiner den dein Programm bemerken wird, sondern eher ein suptiler, nämlich dann, wenn jemand für ein konstantes Objekt die Funktion aufrufen möchte. Außerdem erhöht der Einsatz von const die Sicherheit in deiner Klasse massiv.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
01.06.2005, 11:32 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Ach Windalf, ich glaube, ich schicke demnächst mal die Russen meines Vertrauens zu dir...



Meinst du die ? Die arbeiten schon für mich
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 01.06.2005 um 11:32 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
01.06.2005, 11:54 Uhr
Lumina



Jungs, ihr seid echt Helden.
(In zweierlei Hinsicht...)

@(un)wissender:
Hab deine Anmerkung schon längst eingesehen und es verbessert. Mein Prof besteht auch immer auf den Einsatz von const, wo möglich. Und stimmt ja, warum sollte ich das auch nicht machen. Dann nenn ich zusätzlich meine Variablen etwas anders und schon gefällt es mir auch wieder mit const.

Momentan fallen mir keine neuen String-Funktionen ein. Hat vielleicht noch jemand eine Idee?!

Hier der Header meines bisherigen Ergebnisses:

C++:
// Definition der Klasse CString

#ifndef CSTRING_H
#define CSTRING_H

#include <iostream.h>

class CString
  {
public:
   CString();                       // Standardkonstruktor
   CString(const char*);            // Typumwandlungskonstruktor
   CString(const CString&);         // Copy-Konstruktor
   ~CString();                      // Destruktor

   // Operatoren:
   //operator const char* () const { return(str);} // Typkonvertierungs-
                                                 //  operator; verträgt sich nicht
                                                 // mit Indexoperator!

   CString& operator=(const CString&); // Zuweisungen
   CString& operator=(const char*);    // ueberfluessig ?
                                      
   // Konkatenieren zweier Strings
   friend CString operator+(const CString&, const CString&);
   friend ostream& operator<<(ostream&, const CString&); // Ausgabe

   // Indexoperator
   char& operator[](unsigned);

   // eigene Methoden:
   CString& Rep(unsigned nmal);

   int mystrlen(const char*);
   int CStringLen();

   // Anmerkung: Die Bildung von CStringCat und CStringCpy mit
   // mystrcat und mystrcpy ist nicht möglich, weil die temporäre
   // Zeichenkette in den Unterfunktionen richtig erstellt würde,
   // aber nach deren Verlassen nicht mehr existiert und somit
   // bewirkt der Aufruf der Unterfunktionen in CStringCat und
   // CStringCpy "nur" Rechenzeit!

   void CStringCat(const CString&);
   void CStringCpy(const CString&);

   int mystrcmp(char*, char*);
   int CStringCmp(CString&, CString&);

   int lower(int);
   void lower(char*);
   CString lower();

   int upper(int);
   void upper(char*);
   CString upper();

   void reverse(char*);
   CString reverse();

   int mystrindex(const char*, const char*);
   int CStringIndex(const CString&);
   int CStringIndex(const char*);

   int mystrrindex(const char*, const char*);
   int CStringLastIndex(const CString&);
   int CStringLastIndex(const char*);

   void removeSpaces();
   CString trim();
   void removeFirst(const char*);
   void removeLast(const char*);
   void removeAll(const char*);
   CString RemoveChars(CString&);
   CString RemoveChars(const char*);

   void replaceFirst(const char*, const char*);
   void replaceLast(const char*, const char*);
   void replaceAll(const char*, const char*);

   long my_strcspn(CString&);
   long my_strcspn(const char*);
   bool startsWith(const char*);
   bool endsWith(const char*);
   char& charAt(unsigned);

private:
   char*    str;                    // Zeiger auf Stringanfang
   unsigned len;                    // enthaelt Stringlaenge
  };

#endif


--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
01.06.2005, 12:02 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Wirf doch mal nen blick in std::string dann fällt dir bestimmt noch was ein...

www.sgi.com/tech/stl/basic_string.html
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
01.06.2005, 12:19 Uhr
(un)wissender
Niveauwart


@Windalf
Genau die meinte ich, eben nur andere!

@Lumina
Sowas wie operator+ gibt normalerweise ein const Objekt zurück, also const CString, das gleiche gilt für upper und lower. die würde ich zweimal schreiben, einmal für const und einmal ohne.


C++:
const CString upper() const;
//und
CString& upper();


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
01.06.2005, 12:21 Uhr
(un)wissender
Niveauwart


Du solltest außerem alle Methoden, die du nur innerhab des Objekts verwendetstm als private deklarieren.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
01.06.2005, 12:22 Uhr
(un)wissender
Niveauwart


operator== und != wäre auf jeden Fall noch schön.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
027
01.06.2005, 13:00 Uhr
virtual
Sexiest Bit alive
(Operator)


@Lumina
Erstmal einige Stilanmerkungen:

1. Ich würde nicht die Parameternamen aus aus der parameterliste bei der Funktionsdeklaration rausnehmen, z.B. bei

C++:
   void replaceFirst(const char*, const char*);
   void replaceLast(const char*, const char*);
   void replaceAll(const char*, const char*);


Fällt es mir echt schwer zu wissen, welches der suchtext ist und welches der Ersetzungstext.

2. Die Methodennamen sollten nach gleichen Konventionen benamst werden. Mal große, mal keine Anfangsbuchstaben machen eine Klasse schon fast unnutzbar, wenn man keine IDE mit Autocomplete und Auto-Case-Ignore hat.

Tja, dann mal Inhalthaltlich zu dem, was bisher da ist:


C++:
   ~CString();                      // Destruktor


Also eine Klasse, die man nicht ableiten kann. Ist ja legitim, man sollte sich darüber im klaren sein.


C++:
   // Operatoren:
   //operator const char* () const { return(str);} // Typkonvertierungs-
                                                 //  operator; verträgt sich nicht
                                                 // mit Indexoperator!


Beisst sich vermutlich eher mit dem ctor CString(const char*).
Diese impliziten Typkonvertierer sind im Zweifel teufelszeug, wie aäre es denn mit:

C++:
const char* asChars() const;




C++:
   CString& operator=(const CString&); // Zuweisungen
   CString& operator=(const char*);    // ueberfluessig ?


Zur Frage: jain:
Du kommst auch ohne ihn aus. Fehlt er jedoch, sind Zuweisungen der Art
str = "Hallo";
ungleich teurer, weil zunächst ein temp. Objekt für "Hallo" erzeugt wird und dann - je nachdem wie sicher du den op=(CString) gemacht hast - noch eine weitere Kopie notwendig wird. Also im Zweifelk stehen lassen.


C++:
                                      
   // Konkatenieren zweier Strings
   friend CString operator+(const CString&, const CString&);


Gut, denn so kannst Du auch "Hallo"+str schreiben.

C++:
                                      
   char& operator[](unsigned);


Const variante?

C++:
                                      
   CString& Rep(unsigned nmal);


String vervielfachen, oder was?



C++:
                                      
   int mystrlen(const char*);
   int mystrcmp(char*, char*);


Private?


C++:
                                      
   int lower(int);
   void lower(char*);



Was wird hier gelowert? - Wenn es nicht der Stringinhalt selbst ist, haben die Routinen hier nix zu suchen! Wenn es quasi eine Abkürzung sein soll für
CString str("HALLO");
str.lower();
dann sind die Routinen auch überflüssig


C++:
                                      
   int upper(int);
   void upper(char*);


Dito



C++:
                                      
   void reverse(char*);


Dito.


C++:
   int CStringIndex(const CString&);
   int CStringIndex(const char*);

   int mystrrindex(const char*, const char*);
   int CStringLastIndex(const CString&);
   int CStringLastIndex(const char*);


Was sollen denn diese Routinen? - Suchen sie was? - Dann ist der Methodenname misslungen. "Find" "FindLast", "IndexOf" o.ä. wäre besser


C++:
   void removeSpaces();


Ziemlich willkürlich, finde ich. Warum nicht dann auch

C++:
   void removeAs();


??
Also vielleicht was generischer:

C++:
   void remove(bool (*predicate)(char));




C++:
   CString RemoveChars(CString&);
   CString RemoveChars(const char*);


Was macht das, was macht das mit den parametern?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
028
01.06.2005, 13:04 Uhr
virtual
Sexiest Bit alive
(Operator)


Erweiterungsvorschläge:
rot13
toInt
toDouble
toDate
...
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
029
02.06.2005, 13:15 Uhr
Lumina



@virtual:
Der operator ist von meinem Prof und der Indexoperator auch, nur nicht in derselben Implementierung. Durchs Debuggen haben wir das festgestellt, dass die beiden sich nicht mögen. Das ist also keine Frage, sondern Aussage. Dafür will ich keine Funktion schreiben.

C++:
   // Operatoren:
   //operator const char* () const { return(str);} // Typkonvertierungsoperator,
                                               // verträgt sich nicht mit Indexoperator!



Solche Funktionen wie upper, lower reverse für die char* will ich nicht private machen, weil ich sonst ja nicht z.B. einen einzelnen Großbuchstaben zu nem Kleinbuchstaben oder umgekehrt machen kann. Bei reverse möchte ich ja auch nicht nur einen CString umdrehen können, sondern auch eine normale Zeichenkette.

Den Rest, was die Funktionen machen und was die Namen angeht, siehst du im neuen Header:
Weitere Operatoren sind in Planung.

C++:
// Definition der Klasse CString

#ifndef CSTRING_H
#define CSTRING_H

#include <iostream.h>

class CString
  {
public:
   CString();                       // Standardkonstruktor
   CString(const char*);            // Typumwandlungskonstruktor
   CString(const CString&);         // Copy-Konstruktor
   ~CString();                      // Destruktor

   // Operatoren:
   //operator const char* () const { return(str);} // Typkonvertierungs-
                                                 //  operator; verträgt sich nicht
                                                 // mit Indexoperator!

   CString& operator=(const CString&); // Zuweisungen
   CString& operator=(const char*);
                                      
   // Konkatenieren zweier Strings
   friend CString operator+(const CString&, const CString&);
   friend ostream& operator<<(ostream&, const CString&); // Ausgabe

   // Indexoperator
   char& operator[](unsigned);

   // eigene Operatoren:
   //*****************************************************************
   //  werden ergänzt---- in Bearbeitung...

   // eigene Methoden:
   //*****************************************************************
   CString& Rep(unsigned nmal);

   int mystrlen(const char*);
   int CStringLen();

   // Anmerkung: Die Bildung von CStringCat und CStringCpy mit
   // mystrcat und mystrcpy ist nicht möglich, weil die temporäre
   // Zeichenkette in den Unterfunktionen richtig erstellt würde,
   // aber nach deren Verlassen nicht mehr existiert und somit
   // bewirkt der Aufruf der Unterfunktionen in CStringCat und
   // CStringCpy "nur" Rechenzeit!

   void CStringCat(const CString& src);  // Hängt alle Zeichen von src an this an.
   void CStringCpy(const CString& src);  // Kopiert alle Zeichen von src nach this.

   int mystrcmp(char* str1, char* str2); // Vergleicht str1 mit str2
   int CStringCmp(CString& cstr1, CString& cstr2); // Vergleicht cstr1 mit cstr2

   int lower(int);     // Macht einen Großbuchstaben klein
   void lower(char*);  // Macht aus vielen Großbuchstaben Kleinbuchstaben
   CString lower();    // Macht aus this mit Großbuchstaben nur Kleinbuchstaben

   int upper(int);     // Macht einen Kleinbuchstaben groß
   void upper(char*);  // Macht aus vielen Kleinbuchstaben Großbuchstaben
   CString upper();    // Macht aus this mit Kleinbuchstaben nur Großbuchstaben

   void reverse(char*);  // Kehrt eine Zeichenkette um: "hallo" -> "ollah"
   CString reverse();    // Kehrt this um

   int mystrindex(const char* s, const char* t); // Liefert Index von t in s, bei Fehlen -1
   int CStringIndex(const CString& cstr);   // Liefert Index von cstr in this, bei Fehlen -1
   int CStringIndex(const char* str);       // Liefert Index von str in this, bei Fehlen -1

   int mystrrindex(const char* s, const char* t); // Liefert VON RECHTS HER den
                                                                  // Index von t in s, bei Fehlen -1
   int CStringLastIndex(const CString&);  // Liefert VON RECHTS HER den Index von
                                                       // cstr in this, bei Fehlen -1
   int CStringLastIndex(const char*);     // Liefert VON RECHTS HER den Index
                                                      // von str in this, bei Fehlen -1

   void removeSpaces();                // Entfernt alle Leerzeichen aus this
   CString trim();                     // Entfernt alle Whitespaces am Ende von this
   void removeFirst(const char* s);    // Entfernt s aus this an erster Fundstelle
   void removeLast(const char* s);     // Entfernt s aus this an letzter Fundstelle
   void removeAll(const char* s);      // Entfernt s aus this an allen Fundstellen
   CString removeChars(CString& rStr2);     // Entfernt aus this alle jedes Zeichen, die
                                                          // in rStr2 vorkommen
   CString removeChars(const char* chars);  // Entfernt aus this alle jedes Zeichen, die  
                                                            // in chars vorkommen

   void replaceFirst(const char* old, const char* news); // Ersetzt old durch news
                                             // an erster Fundstelle
   void replaceLast(const char* old, const char* news);  // Ersetzt old durch news
                                             // an letzter Fundstelle
   void replaceAll(const char* old, const char* news);   // Ersetzt old durch news an
                                             // allen Fundstellen

   long my_strcspn(CString& rStr2);     // Zählt alle Zeichen von this mit Ausnahme
                                        // solcher, die in rStr2 enthalten sind
   long my_strcspn(const char* chars);  // Zählt alle Zeichen von this mit Ausnahme
                                        // solcher, die in chars enthalten sind
   bool startsWith(const char* prefix);  // Prüft, ob this mit prefix anfängt
   bool endsWith(const char* suffix);    // Prütt, ob this mit suffix endet
   char& charAt(const unsigned index);   // Liefert das Zeichen an der Stelle index
   unsigned countAll(const char* s);   // Zählt, wie oft s in this vorkommt
   CString substring(const unsigned fromIndex, const unsigned toIndex);  
                                              // Erzeugt aus this einen neuen
                                              // CString von fromIndex bis toIndex
   CString substring(const unsigned fromIndex);
                                               // Erzeugt aus this einen neuen CString
                                                // von fromIndex bis zur Nullterminierung

private:
   char*    str;                    // Zeiger auf Stringanfang
   unsigned len;                    // enthaelt Stringlaenge
  };

#endif



Was soll eigentlich rot13 machen?! und toInt und toDouble sind zwar an sich gute Vorschläge, kommen aber in einem extra Teil in der Prüfung von unserem Prof, also nicht in dieser Klasse. Lass mich einfach weiter von der JAVA-String-Klasse inspirieren...
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************

Dieser Post wurde am 02.06.2005 um 13:19 Uhr von Lumina editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: