C++ Name-Value-Pair aus Post-Methode

Quaussi

Ensign
Registriert
Aug. 2013
Beiträge
243
Grüße Euch,

ich kämpfe zur Zeit mit folgendem Problem:
Ich empfange Daten mit der HTTP Post Methode über eine Client Server Verbindung, die etwa so aussehen:

Code:
Header:
      ...
Body:
      id:123456\n
      firstname:Max\n
      lastname:Mustermann

Mich interessiert jetzt zum Beispiel nur die ID-Nummer, die ich da auch auslesen möchte. Ansatz war für mich erstmal Name-Value-Pair bei der Google suche...naja es ist wahrscheinlich schon zu spät für mich.
Im recvbuffer (char [8192]) steht bei mir die empfangenen Post-Daten.

meine Idee:
Code:
int position = strstr (recvbuffer, "id");  //Position im Buffer????
char Empfaenger [5] = {0};
strcpy (Empfaenger,  recvbuffer [position +1]); //kopieren ab der Position der id

Die Fehlermeldung ergibt, dass ich ein char mit viel Byte nicht in einen char mit wenig Byten kopieren kann.
Kann mir da jemand helfen? Ich werde außerdem das Gefühl nicht los, dass es viel simpler geht :/....
 
Das liegt wohl daran, dass recvbuffer[position+1] vom Typ char ist, strcpy aber char* erwartet. Du solltest also eine Adresse angeben. Außerdem funktioniert das sowieso nicht, da strcpy bis zum \0-Byte kopiert, also viel weiter als du eigentlich erwartest. Deshalb erzeugst du auch einen schönen Buffer Overflow (du hast nur ein Array der Länge 5, kopierst aber deutlich mehr).

strcpy ist _immer_ eine schlechte Idee, man sollte zumindest strncpy verwenden. Und auch da sehr vorsichtig sein mit dem Berechnen der Länge.

Da du aber eh C++ verwendest, solltest du lieber std::string verwenden:
Code:
#include <iostream>
#include <string>

int main()
{
    std::string body = "foo:bar\nid:123456\nfirstname:Max\nlastname:Mustermann";

    size_t pos = body.find("id");
    if (pos != std::string::npos)
    {
        std::string id = body.substr(pos+3, body.find('\n', pos)-pos-3);
        std::cout << "ID: " << id << std::endl;
    }
}
 
Zuletzt bearbeitet: (Code gefixt.)
super Sache...hat funktioniert!!!

dazu hätte ich aber gleich noch eine Frage: body.find('\n', pos) -> warum ist \n nur mit einem Semikolon versehen? Weil es ein "Befehl" ist?
 
Was? Ein Semikolon ist ein Strichpunkt -> ';', also das was man am Zeilenende macht.
Meinst du die einfachen Anführungszeichen? Also '\n' anstatt "\n"? Wenn ja, solltest du dir wirklich mal die Grundlagen von C/C++ reinziehen, wenn du nichtmal den Unterschied kennst. Einzelne Anführungszeichen verwendet man für chars, doppelte für char*, d.h. Strings.
 
hoppla ja ich meine Anführungszeichen :o

der Unterschied ist mir schon bekannt...ich war nur verwirrt, weil es quasi aus 2 Zeichen besteht -> \ + n ...aber es hat ja nur eine Bedeutung, Zeilenumbruch

alles okay
 
Zurück
Oben