Umgebungsvariable einlesen, bestimmte Stelle suchen und zerlegen



  • Hallo Zusammen,

    ich möchte die Umgebungsvariable QUERY_STRING einlesen, und diese zerlegen.
    Das heißt ich suche zuerst nach dem Variablennamen der in der Variablen steht und speicher die Anfangspositon in einer Variablen ab, daraufhin suche ich nach den Trennzeichen '&' und '='. Diese trennen jeweils Variablenname und den dazugehörigen Wert.

    Bisher habe ich folgenden Code:

    std::string Umgebungsvariable=getenv("QUERY_STRING");
    	std::string	sUmgebungsvariable;
    	char *CheckVariable="Nachname=";
    	char *Trennzeichen1="=";
    	char *Trennzeichen2="&";
    	char *stelle;
    	string Wert;
    	int position;
    	int position1;
    	int position2;
    	int groeße;
    
    	stelle = strstr(Umgebungsvariable.c_str(),CheckVariable);
    	position= stelle-Umgebungsvariable.c_str()+1;
    
    	if (stelle != NULL)
    	{
    		stelle=strstr(Umgebungsvariable.c_str(), Trennzeichen1);
    		position1=stelle-Umgebungsvariable.c_str()+1;
    		stelle=strstr(Umgebungsvariable.c_str(), Trennzeichen2);
    		position2=stelle-Umgebungsvariable.c_str();
    		groeße=position2 - position1;
    		sUmgebungsvariable = Umgebungsvariable;
    		Wert = sUmgebungsvariable.substr(position1,groeße);
    		fopen_s(&cLogFile,"./AZeit.log","a");
    		fprintf(cLogFile, "%s\n",Wert);
    		fclose(cLogFile);
    
    	}
    

    Ich weiß noch nicht genau ob das ganze so funtkionieren würde, als ich es gerade testen wollte bekam ich aber 3 Fehlermeldungen:

    1>c:\test\test\app.cpp(42) : error C2440: '=': 'const char *' kann nicht in 'char *' konvertiert werden
    1>        Durch die Konvertierung gehen Qualifizierer verloren
    1>c:\test\test\app.cpp(47) : error C2440: '=': 'const char *' kann nicht in 'char *' konvertiert werden
    1>        Durch die Konvertierung gehen Qualifizierer verloren
    1>c:\test\test\app.cpp(49) : error C2440: '=': 'const char *' kann nicht in 'char *' konvertiert werden
    1>        Durch die Konvertierung gehen Qualifizierer verloren
    

    Was mache ich falsch? Liegt es an c_str()?
    Hoffe jemand kann mir (mit einem kleinen Beispiel) weiterhelfen.

    Mit freundlichen Grüßen
    Everready



  • Dein Fehler ist, dass du C mit C++ mischt. Entfern die "char*" und nutze std::string.



  • Und find statt strstr



  • Hallo,

    ertsmal danke für die beiden sehr schnellen Antworten... 👍
    Ich habe den Code nun folgendermaßen abgeändert:

    std::string Umgebungsvariable=getenv("QUERY_STRING");
    	std::string CheckVariable="Nachname=";
    	std::string Trennzeichen1="=";
    	std::string Trennzeichen2="&";
    	int stelle;
    	string Wert;
    	int position;
    	int position1;
    	int position2;
    	int groeße;
    
    	stelle = Umgebungsvariable.find(CheckVariable);
    
    	if (stelle != string::npos)
    	{
    		stelle=Umgebungsvariable.find(Trennzeichen1);
    		position1=stelle;
    		stelle=Umgebungsvariable.find(Trennzeichen2);
    		position2=stelle;
    		groeße=position2 - position1;
    		Wert = Umgebungsvariable.substr(position1,groeße);
    		fopen_s(&cLogFile,"./AZeit.log","a");
    		fprintf(cLogFile, "%s\n",Wert);
    		fclose(cLogFile);
    }
    

    Allerdings erhalte ich nun folgendes Fehlerfenster, wenn ich das Programm compilieren möchte:

    Debug Asserrtion Failed!
    Programm: c:\test\Debug\app.exe
    File: f:\dd\vctools\crt_bld\self_x86\crt\src\xstring
    Line: 1094
    Expression: invalid null pointer

    Kann mir jemand sagen wo hier der Fehler steckt?

    Mit freundlcihen Grüßen
    Everready



  • Everready schrieb:

    fopen_s(&cLogFile,"./AZeit.log","a");
    		fprintf(cLogFile, "%s\n",Wert);
    		fclose(cLogFile);
    }
    

    Und jetzt hörst du auf C und C++ zu mischen, und benutzt die Streams aus der Standardbibliothek.

    fpritnf ist nicht typsicher. Mit dem Formatwert %s sagst du an, du übergibst einen C-String. C-Strings sind Char-Pointer. Du übergibst jedoch einen völlig anderen Typ, einen std::string.



  • Everready schrieb:

    Kann mir jemand sagen wo hier der Fehler steckt?

    Der Debugger kann das.
    Vielleicht liefert getenv("QUERY_STRING") NULL zurück. Vielleicht aber auch nicht.


Anmelden zum Antworten