C++ Stringoperationen im Vergleich zu C Stringoperationen, C++Anfänger
-
An dem verd... const. Wenn du dir ganz sicher bist, daß WriteClient() die übergebenen Daten nicht verändern wird, darfst du das ausnahmsweise casten als "(LPVOID) buffer.c_str()" (aber da mußt du genau wissen, was du machst - der Compiler kontrolliert nämlich jetzt nicht mehr).
(Anmerkung: Wenn WriteClient() tatsächlich in den String schreiben will, kommst du um ein char-Array nicht herum)
-
Mondmann schrieb:
...
Fehler 10 error C2664: 'BOOL (HCONN,LPVOID,LPDWORD,DWORD)': Konvertierung des Parameters 2 von '*const char ' in 'LPVOID' nicht möglich.Ich denke auch, daß es so gehen müsste, tuts aber leider nicht...
Woran könnte das liegen?
Ist auch klar: Wie schon gesagt, liefert Dir c_str() einen const char*, in den nicht geschrieben werden darf.
Wenn Du einen "beschreibbaren" char-Buffer brauchst, musst Du ihn anlegen.
z.B.... std::string myS("Meine Zeichenkette"); // StringDaten -> char[] char* myBuf = new char[myS.size() + 1]; strcpy(myBuf, myS.c_str()); callMyCAPI(myBuf); // char[]-Daten -> String myS = std::string(myBuf); delete[] myBuf; ...oder so ähnlich.
Das Ganze wird klarer, wenn man "Kapselung" ernst nimmt: std::string kapselt die Daten und bietet gesicherte Zugriffe (damit man nicht mehr schreibt, als "geht". Da Du in C mit einem Pointer beliebig viel schreiben kannst, bietet std::string nicht an).
Wie die Klasse die Daten intern ablegt, ist nicht festgelegt.Wenn Du nun die Daten in einem bestimmten Format vorliegen haben mußt (wie hier: Als aneinanderfolgende bytes im Speicher ab einer bestimmten Adresse), mußt Du eine entsprechende Umformung machen. Dafür bietet std::string Dir entsprechende Methoden an (c_str() oder operator[]()), die natürlich dafür sorgen, dass die interne Konsistenz der Daten gewährleistet bleibt.
Gruß,
Simon2.
-
Das mit dem casten wollte ich eben vermeiden und es funktioniert auch nicht, es fehlt die Hälfte...
Also kann ich das Ganze mit dem schönen, einfachen C++ Handling vergessen und muss es lassen wie es ist?(mit dem lästigen mallos, free,strtok..)*heul*
-
Mondmann schrieb:
...
Also kann ich das Ganze mit dem schönen, einfachen C++ Handling vergessen und muss es lassen wie es ist?(mit dem lästigen mallos, free,strtok..)...Wieso das ?
Du brauchst nur "eine C-compatible Zwischenschicht" für die C-API-Funktionen (z.B. über "meinen" Mechanismus). Alle eigene Fachlichkeit kannst Du dann mit strings machen.Gruß,
Simon2.
-
Mondmann schrieb:
Das mit dem casten wollte ich eben vermeiden und es funktioniert auch nicht, es fehlt die Hälfte...
Vielleicht solltest du die Länge erst berechnen, nachdem du den String zusammengesetzt hast:
buffer=header+top+menue+main+footer; buflen_str = buffer.length();
-
Ok es klappt.
Mit der "zwischenschicht" funktionierts einfandfrei.Denke, langsam schnalle ich die Sache, zumal ich mich das erstemal mit der Materie auseinandersetze.
Vielern, herzlichen Dank für Eure große Hilfe.
Jetzt habe ich erst mal was zu tun....Grüße Mondmann
-
hm..nochmal ne blöde Frage.
Was könnte ich denn für sprintf schreiben in C++?sprintf(buff,"%s %i","Fehlernummer, 100);
Mondmann
-
std::ostringstream s; s << "Fehlernummer " << 100; std::string msg = s.str();Tntnet
-
hmm.ok.
Aber habe ich dadurch irgendwelche Vorteile?
Mal angenommen ich habe nur strings und ich will eine Anfrage zusammenbauen die ich nachher per Socket sende:1.Möglichkeit:
//GETSTAT und c_ausweis1 sind strings in denen bereits was steht. Das "A" könnte //eine spezifische Anfragen sein
//komm_str ist der String der versendet wird.ostringstream os; os << GETSTAT << c_ausweis1 << " A"; komm_str=os.str(); os.clear();2. Möglichkeit
komm_str=GETSTAT; komm_str+=c_ausweis1; komm_str+=" A";Bei der 2. Möglichkeit habe ich eine Anweisung weniger:-)
Welche der beiden wäre hier vorzuziehen?
Gibs eine ganz andere Möglichkeit?Ich muss Strings zusammenbasteln die weitaus mehr beinhalten als das hier:-)
Grüße Mondmann
-
Hallo
Wenn du nur std::strings zusammensbauen willst, ist der +Operator in der Tat sinnvoller. Hast du hingegen noch andere Variablentypen als std::string, dann ist ein stringstream besser, weil dieser gleich typsicher konvertiert.
bis bald
akari
-
Alles klar, das dachte ich mir bereits, wollte es nur noch mal hören und somit sichergehen.
Vielen Dank Mondmann
-
Ok wenn wir gerade dabei sind:
Wie wandle ich einen String in einen integer um?
Hab schon einiges gelesen, auch mit istrintstream usw. aber da kriegt man ja ne kriese!Mit atoi() kommt man leider nicht weit.
Gibts nichts äquivalentes?std::string zahl="10";
Grüße Mondmann
-
Da gibt es einen recht ausführlichen Artikel zu den Möglichkeiten in der FAQ - "Einmal Zahl nach String und zurück".
(was spricht eigentlich gegen atoi? Natürlich mußt du bedenken, daß es mit char* arbeitet - aber an die kommst du problemlos ran:
int i=atoi(zahl.c_str());)
-
Ja danke.
Leider ist es immer so wie immer:
Ich poste etwas und kurz darauf finde ich die Lösung selbst.
Bin ebent selbst auf Deinen Vorschlag mit atoi gekommen:-)Die Faq werde ich mir trotzdem mal durchlesen.
Vielen Dank und schönen Tag noch:-)Mondmann