char array vs. string
-
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)
-
Ich weiss. Ich sage nur:
wstringstream x;
x.str().c_str();Ich sage nur: 42.
Mach dich halt lächerlich.
Mach ich doch.
int ist ein primitiver und verdammt gebräuchlicher Datentyp.
Und? type_info auch.
Hast du noch nie ne verdammte Meldung ausgegeben, wo mal ne veränderbare Zahl drin vorkommt?!
Doch.
funktion (meldung + lexical_cast<string>(wert));
@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.
@Optimizer:
Was ist mit "1" + 1? "11", "2", 2 oder vielleicht sogar 11? (letzeres ist natürlich Quatsch.)Jo, das man mal einen Text aus ein paar chars und einer Zahl zusammenstückelt, ist natürlich "hinz und kunz".
Irgendwie habe ich den Gebrauch von "hinz und kunz" anders in Errinerung.
Bloß nicht die Klasse leicht bedienbar machen, und sowas essentielles wie ne Verknüpfung mit int und strings einbauen.
Stimmt. Ihne solche Verknüpfungen kann ich nicht mehr leben. Sie geben allem überhaut einen Sinn. Sie sind die Essenz meines Lebens.
-
Teilstrings suchen gibts schon in der Standardlib...
Statt Operatoren zu überladen, fände ich dann aber sowas besser:
string s = format("bla %x %x") << x << y;
Sowas hat ja boost, weiß jetzt nur nicht wie es da umgesetzt ist.
-
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.Könntest du für micht bitte auch noch ein operator * (deinstring, int) einbauen, der den String mehrfach hintereinander hängt.
Deinstring ergebnis = Deinstring("ABC") * 3;
ergibt also "ABCABCABC".
und ein operator - fände ich auch gut, um Teilstrings zu löschen:
Deinstring("FooBarFooBarBarBarFoo") - "Foo"
-> "BarBarBarBar"
-
Wenn ICH das brauchen würde, würde ich es einbauen, allerdings in Form einer Methode. Ok, ich bin anscheinend echt der einzige, der mal ne Zahl in nen String einfügen will. Dann hat sich das Thema eh erledigt.
@Optimizer:
Was ist mit "1" + 1? "11", "2", 2 oder vielleicht sogar 11? (letzeres ist natürlich Quatsch.)Wovon rede ich die ganze Zeit? Eine Zahl in Text einfügen? Also natürlich "11". Da kann doch jetzt ich nichts dafür, dass du so ein ... äh ... nicht praxisbezogenes Beispiel gewählt hast.
Tut mir leid, die Sachen die ich anspreche, sind Standard in praktisch jeder Programmiersprache. Ich programmiere nebenbei noch Java und habe früher mit VB programmiert und ich habe noch nie ein Forum gesehen, wo so viele Leute nicht wissen, wie man mit Strings umgeht.
Keine Ahnung warum euch das so weh tut, wenn man einfach schreiben kannString x = "Sie haben " + (int)money + " Euro auf dem Konto."
Ach und sogar an euer Krokodil ist gedacht: In Java hat jede Klasse eine toString() Methode und ich kann tatsächlich schreiben:
meinKrokodil = new Krokodil(); String x = "Bla" + meinKrokodil;
Ein Feature, das man nicht nutzen muss. Aber wenigstens mit primitiven Typen sollte man seinen String schon verknüpfen können.
-
Aber es ist nicht schwer, selbst etwas zu bauen, sei es eine operator+ überladung oder eine string cat(const string&,int) funktion.
allerdings bin ich froh, dass mir nicht irgendein komitee eine solch spezielle bedeutung von + aufhetzt, wenn ich mich dazu entscheide, ein operator+(string,int) zu machen, der strings (->nach int konvertiert) addieren kann.
freie wahl.
-
Ist ein
string x = "Sie haben " + lexical_cast<string>(money) + " Euro auf dem Konto."
so viel komplizierter, als ein
String x = "Sie haben " + (int)money + " Euro auf dem Konto."
?
-
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?wie oben gesagt: ja, vergiss aber nicht, dir die char* auch anzuschauen, ohne geht nicht. fahr zweigleisig.
-
Helium schrieb:
Ist ein
string x = "Sie haben " + lexical_cast<string>(money) + " Euro auf dem Konto."
so viel komplizierter, als ein
String x = "Sie haben " + (int)money + " Euro auf dem Konto."
?
Nein, aber unschöner. Ich frage mich nur immer, warum euch das weh tun würde, wenn das Standardmäßig so gemacht wird, dass man gleich ints und floats anhängen kann?
Oder was ist so schlimm daran, sich selber eine Klasse zu schreiben / die bestehende Klasse entsprechend zu erweitern? Das war ja mein Vorschlag.davie schrieb:
Aber es ist nicht schwer, selbst etwas zu bauen, sei es eine operator+ überladung oder eine string cat(const string&,int) funktion.
allerdings bin ich froh, dass mir nicht irgendein komitee eine solch spezielle bedeutung von + aufhetzt, wenn ich mich dazu entscheide, ein operator+(string,int) zu machen, der strings (->nach int konvertiert) addieren kann.
freie wahl.Ach wie schlimm, dann müsstest du halt beim String ne Methode aufrufen, der dir einen int zurückgibt und in die andere Richtung (die sicherlich häufiger gebraucht wird) hast du es automatisch. Aber so wie es jetzt aussieht, geht ja keins von beiden automatisch.
-
Wo wir von Automatismen reden: Hat deine String-Klasse auch einen operator(int)? Gibt's einen Konstruktor Deinstring(int), der nicht explicit ist?
-
Optimizer schrieb:
Oder was ist so schlimm daran, sich selber eine Klasse zu schreiben / die bestehende Klasse entsprechend zu erweitern? Das war ja mein Vorschlag.
Und was ist so schlimm daran zB lexical_cast zu verwenden?
Das Problem mit dem neuschreiben der String-Klasse ist folgendes: es gibt bereits eine standardisierte Klasse die alles kann was du willst (mit Hilfe von lexical_cast) (IMHO sollten kovertierungen sowieso über eine extra funktion laufen - so dass string dann nicht nur int sondern auch Korkodil kann)