strtok macht mich wahnsinnig



  • Ich hab Folgenden Quelltext:

    void __fastcall TForm1::ClientRead(TObject *Sender,
          TCustomWinSocket *Socket)
    {
     String Parse;
     char *Token;
    
     Token = Client->Socket->ReceiveText().c_str();
    
     Parse = strtok(Token, ":");
     if(Parse == "nfo")
     {
      eLinkDls->Clear();
      eLinkDls->Items->Add(strtok(NULL, "-"));
      eLinkDls->Items->Add(strtok(NULL, "-"));
      eLinkDls->Items->Add(strtok(NULL, "\0"));
     }
    }
    

    und der einkommende String sieht z.B. so aus: "nfo:34-4-46"

    der strtok macht aber nicht
    34
    4
    46
    daraus sondern
    ,.G oder irgendwelche anderen komischen dinge 😮

    ICh bastel jetzt schon seit 2 Tagen daran rum und bei anderen Funktionen hats bis jetzt immer geklappt 😡



  • versuchs ma mit den AnsiString Methoden wenn du schon im falschen Forum postest .... !

    -> LastDelimeter,AnsiPos,SubString

    🙄



  • DreadlockFilbert schrieb:

    Ich hab Folgenden Quelltext:

    eLinkDls->Items->Add(strtok(NULL, "-"));
    

    außerdem wenn du im NIX nach - suchst bist selber dumm .. 😮



  • die strtok funktion bekommt einen string und den behält sie bis der string zuende ist.. also bei \0 und wenn du den selben string weiter zerlegen willst gibst du einen NULL parameter an die Funktion über. :p

    Auserdem hab ich mir gedacht, da wir ja generell mit der VCL arbeiten ist dieses Forum nicht ganz abwegig... 🙄

    deweitern haben wir die strtok funktion schon zig mal so verwendet... und mich als dumm zu bezeichnen find ich das nicht in ordnung 😡



  • Sieh dir in der FAQ mal die Bemerkungen zum Thema "AnsiString nach char* umwandeln" an.
    Ich denke, da liegt der Hund begraben. 😉



  • Tja, das hab ich jetzt mal probiert, aber jetzt kommt noch mehr harakiri..... 🙄

    Ich werde gleich koplett wahnsinnig.......



  • [quote="DreadlockFilbert"]die strtok funktion bekommt einen string und den behält sie bis der string zuende ist.. also bei \0 und wenn du den selben string weiter zerlegen willst gibst du einen NULL parameter an die Funktion .[quote]

    bist du dir sicher das das in dem aktuell aufgerufenen scope noch gültig ist ?



  • String rcvd = "nfo:34-4-46"; // Client->Socket->ReceiveText();
     char Token[1024];
    
     strcpy(Token, rcvd.c_str()); // <-- der Hund ;)
    
     String Parse = strtok(Token, ":"); 
     if(Parse == "nfo")
     {
      eLinkDls->Clear();
      eLinkDls->Items->Add(strtok(NULL, "-"));
      eLinkDls->Items->Add(strtok(NULL, "-"));
      eLinkDls->Items->Add(strtok(NULL, "\0"));
     }
    


  • so gings auch 🙂

    AnsiString Token = "nfo:31-4-44";
    
    if(Token.AnsiPos("nfo:")!=0)
    {
       AnsiString erstezahl  = Token.SubString(Token.AnsiPos(":")+1,Token.AnsiPos("-")-(Token.AnsiPos(":")+1));
       AnsiString zweitezahl = Token.SubString(Token.AnsiPos("-")+1,(Token.LastDelimiter("-"))-(Token.AnsiPos("-")+1));
       AnsiString letzezahl  = Token.SubString(Token.LastDelimiter("-")+1,Token.Length()-(Token.LastDelimiter("-")));
    }
    

    bitte nicht die sauberkeit anschaun 😛



  • Danke! beide gehn....... 😃



  • Wenn schon, denn schon! 😉

    String rcvd = "nfo:34-4-46"; // Client->Socket->ReceiveText();
    if (rcvd.Pos("nfo:") == 1)
      eLinkDls->Items->CommaText = StringReplace(rcvd.Delete(1, 4), "-", ",", TReplaceFlags() << rfReplaceAll);
    

Anmelden zum Antworten