char array vs. string
-
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 benutzenMfG 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
-
Ich denke die große Portabilität ist der größte Vorteil von good ol' char-Arrays.
Hä?
ca. -70 Memberfunktionen.
Mindestens!
Dass auch <String> = <String> + <int> nicht geht?
Dass auch <String> += <int> nicht zum gewünschten Ergebnis führt?Ich finde auch kacke, dass <Traktor> = std::list<Krokodiel> + FuncPtrImpl<void ()> nicht funzt.
Ich fände es extrem scheiße, wen es ginge.
-
Jester schrieb:
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 *.
Eben, und eine Stringklasse kann ja nicht die Fehler von schlechten Libs wieder gut machen.
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?
Wie soll das gescheit funktionieren, dass eine Methode einen char* auf die internen Daten zurückgibt.
So?str.erlaube_reinschreiben(100); schreib_rein(str.pointer()); str.fertig_mit_schreiben();
Dann kommt auf einmal irgend'ne Lib die einen, mit malloc() reservierten, Speicherbereich zurückgibt. Soll string dafür dann auch eine Methode haben, die danach wieder free() aufruft? Bashar hat das schon gut auf den Punkt gebracht.
-
Ok, ok, es ist ein const char* (LPCSTR, oder so ähnlich). Reitet halt ewig darauf rum.
Das war pseudocode, so sieht das wirklich aus:
for (int a = 0; a < 20; ++a) // Einheitentyp for (int b = 0; b < 4; ++b) // Animationstyp { String path = String(_T("Grafik/Einheiten/")) + a + b + _T(".bmp"); D3DXCreateTextureFromFileEx(lpDevice, path.pointer(), D3DX_DEFAULT, ...);
Helium schrieb:
Ich finde auch kacke, dass <Traktor> = std::list<Krokodiel> + FuncPtrImpl<void ()> nicht funzt.
Mach dich halt lächerlich. int ist ein primitiver und verdammt gebräuchlicher Datentyp. Hast du noch nie ne verdammte Meldung ausgegeben, wo mal ne veränderbare Zahl drin vorkommt?!
Jester schrieb:
@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"?Na was wohl? Wenn ich die Zahlen addieren wollen würde, dann würde ich schreiben String x = 12 + 34; und voilà, da haben wirs doch, das funktioniert nämlich auch. Das einzige echte Argument was du gebracht hast, dass man es vielleicht als Hex-Zahl haben will.
DrGreenthumb schrieb:
Optimizer schrieb:
ladeBild(path.pointer()); // <- Pseudocode, Funktion übernimmt char*
Die Methode gibts übrigens und heißt c_str().
Ich weiss. Ich sage nur:
wstringstream x;
x.str().c_str();
Bashar schrieb:
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.
Jo, das man mal einen Text aus ein paar chars und einer Zahl zusammenstückelt, ist natürlich "hinz und kunz". Bloß nicht die Klasse leicht bedienbar machen, und sowas essentielles wie ne Verknüpfung mit int und strings einbauen.
Könnt ja dem Nutzer ermöglichen, sich auf andere Sachen zu konzentrieren.
-
herrlado schrieb:
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?Natürlich sollst du das. Solange dir die Möglichkeiten dort ausreichen, gibt es IMO nichts besseres. Aber vielleicht wirst du trotzdem mal was ergänzen müssen.
Ist ja nichts dabei.
-
Ich weiss. Ich sage nur:
wstringstream x;
x.str().c_str();Verstehe ich jetzt nicht. Wo ist das Problem?
-
Hoppala, ihr lauert ja regelrecht auf eine Antwort.
Ist natürlich kein Problem, so hab ich ja vor kurzem auch noch verfahren. Aber mir gefällt jetzt die Lösung mit meiner Klasse besser, weil ich jetzt auch noch schöne Operatoren habe wie +=, ==, + und in absehbarer Zeit noch Methoden einbaue um nach nen Teilstring zu suchen und so weiter.
Wenn dir das nicht besser gefällt, dann kannst du dich ja freuen, dass es nach deinem Geschmack schon fertig drin ist.
(Ich bin heute so gemein)