String und Variable konkatenieren (verketten)
-
siehe oben
hab mich zugefreut das ich die verkettung gefunden hab. ://
-
Wenn ich nicht ganz falsch liege setzen an den const char .c_str() an ...
-
taurus schrieb:
oder liegt es ganz einfach das ich die verkenntung mit dem operator nicht durchführen kann?
Man kann keine C Arrays mit dem
operator+
verketten. Verwende in C++std::string
, wenn du Zeichenketten verketten willst. Alles andere ist umständlich und fehleranfällig.Grüssli
-
mhh aber das problem ist:
GetPrivateProfileStringA //erwartet char* send(new_socket, request, strlen(request) + 1, NULL); //erwartet const char*
gibt es für sowas nicht ein allheil rezept?
hier mal zur übersicht der code:
//Read INI File char server1[500]; char filename[500]; DWORD destSize; destSize = 500; GetPrivateProfileStringA("servers", "server1" ,"NULL", server1, destSize, "c:\\statwriter\\release\\config.ini"); GetPrivateProfileStringA("file", "filename" ,"NULL", filename, destSize, "c:\\statwriter\\release\\config.ini"); //..... //Send Request //datafile.txt soll natürlich durch die var filename ersetzt werden... //nicht zwingend, aber besser zum handling damit der dateiname(bzw. pfad) auch über die ini editierbar ist const char* request = "GET /datafile.txt HTTP/1.1\r\nHost: 213.23.159.67g\r\nConnection: close\r\n\r\n"; int result = send(new_socket, request, strlen(request) + 1, NULL);
grüße
felix
-
Wie ich im anderen Thread sagte, verwende die C++ Möglichkeiten. Vielleicht solltest du allgemein zuerst vernünftig C++ lernen, bevor du dich da mit der WinAPI rumschlägst?
char filename[500]; GetPrivateProfileStringA(...); std::string request = "GET /"; request += filename; // Ich hoffe mal, dass GetPrivateProfileStringA eine Nullterminierung durchführt. request += " HTTP/1.1\r\nHost: 213.23.159.67g\r\nConnection: close\r\n\r\n"; send(new_socket, request.c_str(), request.size(), NULL);
Grüssli
-
na an praktischen beispielen lernt man am besten... und dabei versuche die datentypen, zeiger etc. zu verstehen
ja soweit wie du geschrieben hast war ich auch... bis ich entdeckt habe das ich bei strlen(request) noch ein c_str fehlt...bzw das falsch wäre weil strlen ja nicht bei strings/vektoren funktioniert, oder?
nullterminierung wird wohl durchgeführt... wenn dem nicht so wäre würde es einen fehler geben weil das proramm nicht weiß wo die zeichenkette zu ende ist, oder?
vielen vielen dank! dann bin ich jetzt wieder schlauer
grüße
felix
-
taurus schrieb:
na an praktischen beispielen lernt man am besten...
Solange rumprobieren, bis es geht, ohne es richtig verstanden zu haben, ist nicht das beste, was man machen kann.
taurus schrieb:
und dabei versuche die datentypen, zeiger etc. zu verstehen
Dann fang doch mit einem guten Buch an.
taurus schrieb:
ja soweit wie du geschrieben hast war ich auch... bis ich entdeckt habe das ich bei strlen(request) noch ein c_str fehlt...bzw das falsch wäre weil strlen ja nicht bei strings/vektoren funktioniert, oder?
std::string foo = ...; strlen(foo.c_str()); // geht, ist aber bekloppt (1) foo.length(); // besser
bei (1) wird die Nullterminierung wieder gesucht, obwohl das String-Objekt die Länge schon kennt.
-
Solange rumprobieren, bis es geht, ohne es richtig verstanden zu haben, ist nicht das beste, was man machen kann.
naja ich würde es nicht als rumprobieren bezeichnen sondern als versuch anhand der grundlagen und beispielen die funktionsweise kennenzulernen
std::string foo = ...; strlen(foo.c_str()); // geht, ist aber bekloppt (1) foo.length(); // besser foo.size() // oder size wie dravere beschrieben hat?
wobei ich annehme das size nur bei vektoren sinn macht und hier ein length ausreicht?
-
taurus schrieb:
wobei ich annehme das size nur bei vektoren sinn macht und hier ein length ausreicht?
Ist das selbe. Length klingt sinniger bei strings, size ist der allgemeine Ausdruck bei Containern - std::string ist einer davon.
-
taurus schrieb:
Solange rumprobieren, bis es geht, ohne es richtig verstanden zu haben, ist nicht das beste, was man machen kann.
naja ich würde es nicht als rumprobieren bezeichnen sondern als versuch anhand der grundlagen und beispielen die funktionsweise kennenzulernen
Halte ich für einen sehr gefährlichen und mühsamen Weg. Geht doch viel einfacher, wenn man etwas für die Funktionsweise liest und es danach probiert anzuwenden, meinst du nicht auch?
Gefährlich übrigens deswegen, weil in C und C++ etwas kompilieren und funktionieren kann, es aber trotzdem falsch ist. Es funktioniert nämlich womöglich nur gerade in diesem einen Fall, weil du undefiniertes Verhalten ausgelöst hast. Irgendwann und irgendwo, muss nicht mal an der Stelle sein, wo du den Fehler gemacht hast, wird es dann gewaltig krachen.Aktuelles Beispiel aus diesem Thread:
taurus schrieb:
nullterminierung wird wohl durchgeführt... wenn dem nicht so wäre würde es einen fehler geben weil das proramm nicht weiß wo die zeichenkette zu ende ist, oder?
Nein! Wenn keine Nullterminierung vorhanden ist, entsteht undefiniertes Verhalten. Es kann funktionieren, es kann abstürzen, es können dir Hörner wachsen, es kann die Welt explodieren, du kannst Antimaterie herstellen, dein Computer kann explodieren, deine Mutter sterben, dieses Forum gelöscht werden, ein Wurmloch entstehen, ein Wurm daraus hervorkommen und dich auffressen, die Weltmeere könnten verdampfen, die nächste Eiszeit auslösen, dein Stuhl kaputt gehen ... ehm, ok, ok, ich denke es ist nun klar, was undefiniertes Verhalten bedeutet
Grüssli
-
taurus schrieb:
Solange rumprobieren, bis es geht, ohne es richtig verstanden zu haben, ist nicht das beste, was man machen kann.
naja ich würde es nicht als rumprobieren bezeichnen sondern als versuch anhand der grundlagen und beispielen die funktionsweise kennenzulernen
Du lernst ja aber nicht die Grundlagen (nämlich wie man mit strings umgeht), sondern probierst herum, indem du mal schaust was passiert wenn du op+ auf chars anwendest.
-
ihr habt ja recht.. einmal die grundlagen durchlesen und dann loslegen reicht halt nicht
werde mir mal bei gelegenheit die bücher im anderen thread in der bib anschauen..
weil.. anfangs dachte ich c++ lernste jetzt nich machste mit php weiter.. aber als ich angefangen hab fand ich das richtig toll
-
taurus schrieb:
Solange rumprobieren, bis es geht, ohne es richtig verstanden zu haben, ist nicht das beste, was man machen kann.
naja ich würde es nicht als rumprobieren bezeichnen sondern als versuch anhand der grundlagen und beispielen die funktionsweise kennenzulernen
WinAPI gehört aber nicht zu den C++ Grundlagen. Man sollte erst einmal die Grundlagen einer Sprache einigermaßen beherrschen, bevor man sich mit weiterführenden Bibliotheken beschäftigt (ins besondere, wenn deren Design sich massiv von dem der C++ Standardbibliothek unterscheidet, zumal die WinAPI auf C, nicht auf C++ aufsetzt, und alleine daher schon "fremder" ist).
Und das was du machst ist nur stupides rumprobieren, ohne sich daraus wirklich ein fundiertes Wissen zulegen zu können. Ich kenne einige die diesen Weg gegangen sind, und zumeist führte dies zu viel falschen Halbwissen.
Das wäre so, als würdest du dir eine Sprache nur dadurch aneignen wollen, das du nur Filme in dieser Sprache aus einem Genre anschaust. Vielleicht lernst du sogar ein paar Worte oder Sätze, aber im realen Einsatz benutzt man nicht unbedingt eine Teeni-Begrüßung in einem wichtigen Geschäftsgespräch...
Man sollte sich Wissen Stufenweise beibringen, und nicht meinen, das man gleich alles lernen kann.
-
das du nur Filme in dieser Sprache aus einem Genre anschaust.
hättest du gesagt "nur Filme in dieser Sprache anschaust" hätte ich gesagt ja Sprachen kann man so auch lernen
-
taurus schrieb:
das du nur Filme in dieser Sprache aus einem Genre anschaust.
hättest du gesagt "nur Filme in dieser Sprache anschaust" hätte ich gesagt ja Sprachen kann man so auch lernen
Selbst das bezweifle ich. Zumindest solange man keine weiteren Hilfsmittel hinzuzieht.
-
also z.b. urlaub in dem land dessen sprache man lernen möchte?
ja ohne das geht es nicht