[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)));
    }
    
    }
    

    😮


Anmelden zum Antworten