c++ Split Problem?!



  • Ich hab hier eine funktion geschrieben die von updateserver einen string abholt und der dann nach | durchlaufen werden soll und die daraus resultierenden zeichenketten in eine chararry geschrieben werden (~). Aber irg wie gibt er mir die 2. zeichen kette (|) nich aus? könnt ihr mir helfen

    Bsp. Zeichenktte vom server "string1string2string3string4|string1string2~string3|...."

    Source:

    void HandleCommand(char* data)
    {
    	char Command[sizeof(data)];
    	strcpy(Command,data);
    	char *CommandBuffer[sizeof(data)];
    	char *pch;
    	int i = 0;
    
    	pch = strtok(Command,"~");
    	while (pch != NULL)
    	{
    		CommandBuffer[i] = pch;
    		pch = strtok (NULL, "~");
    		i++;
    	}
    	if(!lstrcmp(CommandBuffer[0], "11"))
    	{
    		MessageBox ( NULL, CommandBuffer[1], "Test", MB_OK);
    	}
    }
    
    void StartCommandManagement(char *WebpanelRequest,char *Domain)
    { 
    	while (true)
    	{
    		char *request = HttpRequest(WebpanelRequest,Domain,80);
    		char *pch;
    
    		pch = strtok(request,"|");
    		while (pch != NULL)
    		{
    			if(strstr(pch, "~")!=0){
    				//Start Handle Command
    				HandleCommand(pch);
    			}
    			pch = strtok(NULL, "|");
    		}
    		request[0] = '\0';
    		break;
    	}
    }
    


  • spike1993 schrieb:

    void HandleCommand(char* data)
    {
    	char Command[sizeof(data)];
    	strcpy(Command,data);
    	char *CommandBuffer[sizeof(data)];
    

    Auch in deinem reinen C-Code liefert sizeof(data) nicht dir Länge des Arrays! Das kann also nur schief gehen.



  • das ja wyn kann ja auch 50 oder so reinschreiben aber wo ist der fehler das er immer nur die 1. zeichenkette bearbeitet?



  • spike1993 schrieb:

    das ja wyn kann ja auch 50 oder so reinschreiben aber wo ist der fehler das er immer nur die 1. zeichenkette bearbeitet?

    ? wyn?



  • is doch w4yne - mag jemand käse zum wyn?

    Nachmal darüber nachdenken was für einen Wert du mit sizeof(char*) erhälst 🙂
    Und wieviele Elemente demnach Command und CommandBuffer haben.



  • source moddet aber trotzdem ist das problem noch da.

    void HandleCommand(char* data)
    {
    	char Command[5];
    	strcpy(Command,data);
    	char *CommandBuffer[5];
    	char *pch;
    	int i = 0;
    
    	pch = strtok(Command,"~");
    	while (pch != NULL)
    	{
    		CommandBuffer[i] = pch;
    		pch = strtok (NULL, "~");
    		i++;
    	}
    	if(!lstrcmp(CommandBuffer[0], "11"))
    	{
    		MessageBox ( NULL, CommandBuffer[1], "Test", MB_OK);
    	}
    }
    
    void StartCommandManagement(char *WebpanelRequest,char *Domain)
    { 
    	while (true)
    	{
    		char *request = HttpRequest(WebpanelRequest,Domain,80);
    		char *pch;
    
    		pch = strtok(request,"|");
    		while (pch != NULL)
    		{
    			if(strstr(pch, "~")!=0){
    				//Start Handle Command
    				HandleCommand(pch);
    			}
    			pch = strtok(NULL, "|");
    		}
    		request[0] = '\0';
    		break;
    	}
    }
    


  • spike1993 schrieb:

    Bsp. Zeichenktte vom server "string1string2string3string4|string1string2~string3|...."

    spike1993 schrieb:

    char Command[5];
        strcpy(Command,data)
    

    Du machst deine Buffer viel zu kurz und wunderst dich dann, wenn du dir den Stack zerschießt und merkwürdiges Verhalten rauskriegst? Das mit der Speicherverwaltung solltest du besser noch mal üben. Mit zu wenig Speicher zu arbeiten ist keine Lappalie!

    Ansonsten sieht mir der Code eigentlich so aus, als gehöre er mehr ins C- als ins C++-Forum. In C++ ginge das beispielsweise so:

    void HandleCommand(std::string const &data)
    {
      std::istringstream tokenizer(data);
      std::string token;
      std::vector<std::string> commands;
    
      while(std::getline(tokenizer, token, '~')) {
        commands.push_back(token);
      }
    
      if(commands.size() > 1 && commands[0] == "11") {
        MessageBox(NULL, commands[1].c_str(), "Test", MB_OK);
      }
    }
    
    void StartCommandManagement(std::string const &WebpanelRequest, std::string const &Domain)
    {
      while (true) {
        std::string request = HttpRequest(WebpanelRequest.c_str(), Domain.c_str(), 80);
        std::istringstream tokenizer(request);
        std::string token;
    
        while(std::getline(tokenizer, token, '|')) {
          if(token.find('~') != std::string::npos) {
            HandleCommand(token);
          }
        }
    
        request.clear();
        break;
      }
    }
    

    ...und c_str() auch nur, weil mir das nach einem C-API aussieht, um das man nicht herumkommt.



  • #include <string>
    #include <iostream>
    using namespace std;
    
    void HandleCommand(std::string const &data)
    {
      istringstream tokenizer(data);
      string token;
      vector<string> commands;
    
      while(getline(tokenizer, token, '~')) {
        commands.push_back(token);
      }
    
      if(commands.size() > 1 && commands[0] == "11") {
        MessageBox(NULL, commands[1].c_str(), "Test", MB_OK);
      }
    }
    
    void StartCommandManagement(std::string const &WebpanelRequest, std::string const &Domain)
    {
      while (true) 
      {
        string request = HttpRequest(WebpanelRequest.c_str(), Domain.c_str(), 80);
        istringstream tokenizer(request);
        string token;
    
        while(getline(tokenizer, token, '|')) {
          if(token.find('~') != std::string::npos) {
            HandleCommand(token);
          }
        }
    
        request.clear();
        break;
      }
    }
    

    Fehler:

    1>  CommControl.cpp
    1>CommControl.cpp(10): error C2079: 'tokenizer' verwendet undefiniertes class 'std::basic_istringstream<_Elem,_Traits,_Alloc>'
    1>          with
    1>          [
    1>              _Elem=char,
    1>              _Traits=std::char_traits<char>,
    1>              _Alloc=std::allocator<char>
    1>          ]
    1>CommControl.cpp(10): error C2440: 'Initialisierung': 'const std::string' kann nicht in 'int' konvertiert werden
    1>          Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden
    1>CommControl.cpp(12): error C2065: 'vector': nichtdeklarierter Bezeichner
    1>CommControl.cpp(12): error C2275: 'std::string': Ungültige Verwendung dieses Typs als Ausdruck
    1>          C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xstring(2063): Siehe Deklaration von 'std::string'
    1>CommControl.cpp(12): error C2065: 'commands': nichtdeklarierter Bezeichner
    1>CommControl.cpp(14): error C2780: 'std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &)': Erwartet 2 Argumente - 3 unterstützt
    1>          C:\Program Files\Microsoft Visual Studio 10.0\VC\include\string(479): Siehe Deklaration von 'std::getline'
    1>CommControl.cpp(14): error C2784: "std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem)": template-Argument für "std::basic_istream<_Elem,_Traits> &" konnte nicht von "int" hergeleitet werden.
    1>          C:\Program Files\Microsoft Visual Studio 10.0\VC\include\string(468): Siehe Deklaration von 'std::getline'
    1>CommControl.cpp(14): error C2780: 'std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &&,std::basic_string<_Elem,_Traits,_Alloc> &)': Erwartet 2 Argumente - 3 unterstützt
    1>          C:\Program Files\Microsoft Visual Studio 10.0\VC\include\string(448): Siehe Deklaration von 'std::getline'
    1>CommControl.cpp(14): error C2784: "std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &&,std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem)": template-Argument für "std::basic_istream<_Elem,_Traits> &&" konnte nicht von "int" hergeleitet werden.
    1>          C:\Program Files\Microsoft Visual Studio 10.0\VC\include\string(395): Siehe Deklaration von 'std::getline'
    1>CommControl.cpp(14): fatal error C1903: Weiterverarbeitung nach vorherigem Fehler nicht möglich; Kompilierung wird abgebrochen.
    1>
    1>Fehler beim Erstellen
    

    hab ich irg was vergessen?



  • #include <sstream>
    

Anmelden zum Antworten