char array vs. string



  • Ich finde beides schlecht. 😉
    Ich würde lieber ne eigene String-Klasse schreiben. Falls nicht, dann würde ich aber auch zu std::string raten. 😃



  • Optimizer schrieb:

    Ich würde lieber ne eigene String-Klasse schreiben.

    Generell betrachtet ist das natürlich die denkbar schlechteste Lösung.



  • Optimizer schrieb:

    Ich finde beides schlecht. 😉
    Ich würde lieber ne eigene String-Klasse schreiben.

    Wieso das?



  • Ja, jeder sollte seine eigene string-Klasse bauen, mit möglichst verschiedenen Methodennamen, damit auch keiner den Code vom anderen verstehen kann. Am besten wir verschlüsseln die Methodennamen mit MD5. Dann kann man wirklich nur noch selbst die Klasse benutzen. Programmieren muß wieder schwerer werden!
    😃



  • Ich finds schon schwer genug, der Code meines Vorgesetzten ist selbstverschlüsselnd.... ;o)

    Beispiel:

    SpeziellesFlagNichtVerwendenAn=false; // Alles klar :clown:
    
    // irgendwo global:
    bFlag = true;
    
    // Bei der Abfrage:
    // Wenn bFlag = 1 dann fn1;
    // Wenn bFlag = 2 dann fn1;
    // Wenn bFlag = 3 dann fn1;
    // Wenn bFlag = 4 dann fn1;
    
    if(bFlag == 1)
      fn1();
    else if(bFlag == 2)
      fn2();
    else if(bFlag == 3);
      fn3();
    else if(bFlag == 4);
      fn4();
    

    Ein Kunde hat ein Fehler in fn4, aber nirgends wird bFlag auf 4 gesetzt.
    Mir reichen solche rätsel schon 🤡



  • Wieso? Weil std::string gerade noch besser als char* ist. Amsonsten ist es wirklich ... und kann nichts.
    Meine Meinung.
    Ihr könnt da anderer Meinung sein, ihr seid vielleicht nicht so verwöhnt wie ich, aber die std::string-Klasse ist in meinen Augen ein Witz.



  • Also ich finde konkatenieren mit + und Vergleich mit == schonmal sehr sehr praktisch.
    Dann sag doch mal was eine ordenliche string-Klasse können müßte?
    Was fehlt std::string denn?

    MfG Jester



  • Jester schrieb:

    Was fehlt std::string denn?

    ca. -70 Memberfunktionen. 😉



  • for (int a = 0; a < 10; ++a)
        for (int b = 0; b < 10; ++b)
        {
            String path = String("/Grafik/Bild") + a + b + ".bmp";
            ladeBild(path.pointer());   // <- Pseudocode, Funktion übernimmt char*
        }
    


  • @Bashar:
    Ja, da muß ich Dir recht geben.

    @Optimizer:
    Ich verstehe nicht was Du mir mit diesem Code sagen willst.

    MfG Jester



  • Dass das mit std::string nicht geht?
    Dass auch <String> = <String> + <int> nicht geht?
    Dass auch <String> += <int> nicht zum gewünschten Ergebnis führt?

    geschweige denn von verknüpfungen mit double oder float. Offenbar brauchst du nicht viel, wenn std::string alles bietet, was du brauchst.
    Ich muss halt doch öfter mal Bilder in einer Schleife laden.
    Oder mal ne Meldung ausgeben:

    String bla = String("Sie haben noch ") + lives + " Leben übrig.";
    

    Es gibt unzählige Situationen, wo man mit std::string nicht weiter kommt. DAS ist die denkbar schlechteste Lösung, nicht ne eigene Klasse zu schreiben. 🙄



  • 2 Möglichkeiten:

    a) operator+ für string, int überladen
    b) stringstreams benutzen

    MfG Jester



  • Jo, ich kenne diese Möglichkeiten. Bis vor kurzem hab ich noch die zweite genutzt.
    Ich kann nur echt nicht verstehen, wie man sinngemäß sagen kann, "Hey, std::string hat doch alles, was man braucht". 🙄

    Ich finde die Klasse ziemlich arm, und wenn sich da mal ein Heinz hinsetzen würde und eine richtig gute String Klasse schreiben würde, und die dann zur Standard-Lib hinzugefügt wird, dann würde sie jeder verwenden und in diesem Forum gäbe es nur noch halb so viele Threads (ok, kann man auch als Nachteil sehen ;)).
    Es ist wirklich so, eine ganz beträchtliche Anzahl an Fragen hier betreffen C++-Strings. Aber nicht wahr, Hume, es ist ja so unglaublich falsch, eine anständige Klasse zu coden und damit das Problem ein für alle mal aus der Welt zu schaffen. 😉



  • Optimizer schrieb:

    ladeBild(path.pointer());   // <- Pseudocode, Funktion übernimmt char*
    

    Die Methode gibts übrigens und heißt c_str().



  • Ne, gibt's nicht... c_str liefert nen const char *, wozu die Bild-Ladefunktion allerdings nen char * braucht ist mir nicht klar, wahrscheinlich tut's da wohl auch ein const char *.

    @Optimizer:
    Warum gibts eine solche Klasse nicht im Standard? Weil jeder unter so ner Addition was anderes versteht. Was heißt denn
    "12"+"34"? ist das "1234" oder "46"?
    Ich will aber, daß alle meine Zahlen in hex an die strings gehängt werden...
    es gibt da einfach zu viele Möglichkeiten um eine als Standard festzulegen.



  • Optimizer: Eine Klasse sollte genau eine genau definierte Aufgabe haben, nicht mehrere. Das ist ein Grundprinzip guten OO-Designs. Es kann nicht Sinn und Zweck einer String-Klasse sein, für jeden Hinz und Kunz passende Funktionen bereitzustellen.



  • Optimizer schrieb:

    /* ... Funktion übernimmt char* */
    

    da geht c_str() bzw. data() nicht mehr.
    das ist dann aber schlechtes design von ladeBild (imho muss die nix am char* ändern, oder old-style)

    ein ausweg wäre

    char *c = new char[std_string.length()+1]
    std_string.copy(c, string::npos);
    c[std_string.length()] = 0;
    ladeBild(c);
    delete c;
    

    wenn man solche alten funktion unbedingt verwenden muss.



  • Generel bevorzuge ich string über char*, allerdings hat sie auch einige Schwächen:
    Sie taugen nicht als Dll Rückgabe Wert und Argumente geben nur auf dem Umweg eines char* und man kann keine Referencen/Pointer benutzen.

    Sie taugen nicht als buffer. Wenn zum Beispiel die WinAPI einen string zu rückgeben will muss man zuerst einen char Array erstellen anschließend eine string Kopie anfertigen und dann Array wieder löschen. Wäre es nicht einfacher wenn man reserve aufrufen könnte und anschließend direkt in den Buffer schreiben könnte?

    In manchen Situation zu ineffizent.



  • Danke!
    Aber was würdet ihr mir empfehlen, als Anfänger zu nutzen? Bin siet ein Paar Monaten dabei.Bisher habe ich immer string benutzt. Also soll ich mit string weitermachen?



  • Hi,

    template <class T>
    std::string toString(T num)
    {
    	// Write the number to a temporary stringstream
    	std::ostringstream stringStream;
    	stringStream << num;
    
    	// Return stringstream as a string
    	return stringStream.str();
    }
    

    Und schon kannst du bequem Strings schreiben, wie du willst. Natürlich kannst du auch einen globalen Templateoperator + und += schreiben. 🙂

    ChrisM


Anmelden zum Antworten