[Gelöst]map find liefert keine ausgabe
-
Versuche länger schon mit find einen rückgabe wert zu bekommen ohe erfolg. Weiß einfach nicht meht weiter, scheint aber mit der schleife zusammen zuhängen aushalb einer schleife eingeführtes mit insert funktioniert.
cgi.cpp
#include <iostream> #include <string> #include <fstream> #include <vector> #include <map> #include <algorithm> #include "cgi.h" #define CGI using std::vector; using namespace std; /* The cgi request function to get the cgi query_string */ namespace cgi { bool request() { query_string = string(); char *request = getenv("REQUEST_METHOD"); char *env = getenv("QUERY_STRING"); char *clength = getenv ("CONTENT_LENGTH"); if( request == 0 ) { return false; } else if(request == std::string("GET")) { if (env != 0) { query_string = env; return true; } else return false; } else if(request == std::string("POST")) { if (clength != 0) { getline(cin, query_string);; return true; } else return false; } else return false; } /* This function formated the cgi input. */ void urlencode() // hole query string pair speicher dieses in einem vector { unsigned int len; len = query_string.length(); for (std::size_t pos = query_string.find("+"); pos != std::string::npos; pos = query_string.find("+", ++pos)) query_string.replace(pos, 1, " "); size_t pos = 0; size_t old_pos = 0; while(len > pos) { pos = query_string.find("&", old_pos); if (pos == string::npos) pos = query_string.length(); query_tmp.push_back(query_string.substr(old_pos, pos-old_pos)); //in vector zurückgeben old_pos = pos+1; }; vector<string>::iterator copy; size_t start = 0; size_t end = 0; // im vector wird paar zerlegt umd in einer map zurück gegeben for(copy = query_tmp.begin(); copy != query_tmp.end(); copy++) { string tmp= *copy; start = tmp.find("="); end = ++start; query.insert(QueryPair(tmp.substr(0, --start) ,tmp.substr(end))); } } //get query single ouput const string getcgidata(string formname) { Query::iterator iter; Query::const_iterator search = query.find(formname); //ausgabe aller map objecte funktioniert for( iter = query.begin(); iter != query.end(); ++iter ) { cout << "Key: '" << iter->first << "', Value: " << iter->second << endl; search = query.find(formname); //versuch mit find funtioniert nicht } if(search == query.end()) { return "error"; } return search->second; } }cgi.h
#include <iostream> #include <map> #include <algorithm> #include <vector> using std::vector; using namespace std; namespace cgi { std::string query_string; typedef map<std::string,std::string > Query; typedef Query::value_type QueryPair; Query query; vector<string> query_tmp; bool request(); //GET CGI DATA void urlencode(); // parse the CGI query_string const string getcgidata(string formname); // cgi single ouput }test.cpp
#include <iostream> #include <c++pwl/html.h> #include <c++pwl/cgi.h> #include <map> #include <vector> using namespace std; using namespace cgi; using namespace html; int main() { starthtml("TEST1"); startform("GET", "test"); formselect("test","<option>Moin</option> <option> Tach </option> <option> guten tag </option>"); formselect("test1","<option>Schuess</option> <option> Bye </option> <option> Auf wiedersehen </option>"); input("Schicken", "submit"); endform(); request(); //query abholen urlencode(); //query in map zurückgeben string output; output = getcgidata("test"); //mit find object zurück geben cout << output << endl; endhtml(); }
-
Zuerst einmal solltest du, wenn du groesseres vorhast keine using-direktiven in headern verwenden, da die sich dann auch auf alle Dateien auswirken, die diese header #includen. Ausserdem schreibst du ja eh in 50% der Faelle schon das std:: davor, wenns einheitlich wird ists auch spaeter besser lesbar.
Dann kannst du die if-elses in deiner request() funktion uebersichtlicher gestalten, indem du aus den tausenden returns ein einziges machst und die ganzen verzweigten Bedingungen zusammenfasst:
bool ret = false; if(std::string(request) == std::string("GET") && env) { query_string = env; ret = true; } else if(std::string(request) == std::string("POST") && clength) { getline(cin, query_string); ret = true; } return ret;Naechster Punkt: werd mit dir selbst einig ob du in urlencode() size_t oder unsigned int nutzen willst.
Dann noch etwas: kapsel das ganze am Besten in einer Klasse. bisher hast du zwar immerhin einen namespace benutzt, aber die Funktionen und Objekte (selbst hilfsobjekte, wenn ich das richtig sehe) fliegen darin lose rum, das kann man besser kapseln.
Was dein problem angeht: Ich habe zwar keinen direkten Fehler finden koennen, aber evtl. spielen da blanks in den strings eine Rolle. Mach mal bei deiner ausgabeschleife jeweils noch einen Test auf gleichheit des Keys mit dem gesuchten key dazu (also find manuell sozusagen), vielleicht gibt das weiter Aufschluss.
-
Ehm du hattest genau diesem Code vor nen paar Wochen schonmal gepostet ... da hab ich dir den komplett einmal aufgeräumt und "C++-Style" hinzugefügt
Von d.h. musst du den Fehler jetzt mal selbst finden ...
-
hab den fehler durch zufall gefunden

vorher:for(copy = query_tmp.begin(); copy != query_tmp.end(); copy++) { string tmp= *copy; start = tmp.find("="); end = ++start; query.insert(QueryPair(tmp.substr(0, --start) ,tmp.substr(end))); }nacher:
for(copy = query_tmp.begin(); copy != query_tmp.end(); copy++) { const string tmp=*copy; start = tmp.find("="); end =++start; query.insert(QueryPair(tmp.substr(1, ----start) ,tmp.substr(end))); } }