Stringzerlegung mit strtok()



  • Hallo,

    Ich habe ein Problem mit der funktion strtok(). und zwar möchte ich einen String der Form "Bezeichner;Länge;Wert;Bezeichner2;Länge2;Wert2;...." zerlegen.

    an sich klappt das Zerlegen auch, aber wenn ich die werte in Variablen speichern möchte, kommt es zu komischen Ereignissen. Mal haben alle Variablen den Inhalt des letzten Wertes, mal hängen noch etliche Sonderzeichen an den gelesenen Werten.
    Muss ich dort mit Zeigern arbeiten ? Oder gibt es einen anderen Fehler den ich übersehen habe ?

    Gruß und danke Yoda



  • Magst mal ein kleines Beispielprogramm posten, wo der Fehler auftritt?



  • Naja, im Grunde würde sich strtok_r anbieten.
    Erst nach den Bezeichnern aufdröseln und dann nach den Strichpunkten.



  • http://www.mkssoftware.com/docs/man3/strtok_r.3.asp schrieb:

    The strtok_r() function is a reentrant version of strtok().

    reentrant: kann mehrere verschiedene strings nebeneinander verarbeiten.
    daran koennt es liegen...

    aber wenn der OP schon von "muss ich dort mit zeigern arbeiten?" redet, dann tippe ich auf einen ganz anderen grund.

    @OP: beispielcode bitte. du moechtest auch [1] und [2] lesen.

    [1] http://www.c-plusplus.net/forum/viewtopic-var-t-is-136013.html
    [2] http://www.c-plusplus.net/forum/viewtopic-var-t-is-134691.html



  • Hallo,
    hier mal ein Beispiel.
    Ich habe mehrere Varianten probiert ( auch selber parsen mit strchr()und strcpy())
    aber irgendwie gab es immer probleme.

    void test(){
      char Date[8];
      char Time[6];
      char MID[19];
      char error[20];
      char *ptr2;
      strcpy(temp,"1000;$ES;DATUM;8;20060516;ZEIT;6;152219;ERROR;1;0;");
      ptr2 = strtok(temp, ";");
      strcpy(MID,ptr2);
      ptr2 = strtok(NULL,  ";");
      ptr2 = strtok(NULL,  ";");
      strcpy(Date,ptr2);
      printf("DATETest %s\n",Date);
      ptr2 = strtok(NULL, ";");
      ptr2 = strtok(NULL, ";");
      ptr2 = strtok(NULL, ";");
      strcpy(Time,ptr2);
      ptr2 = strtok(NULL, ";");
      ptr2 = strtok(NULL, ";");
      ptr2 = strtok(NULL, ";");
      strcpy(error,ptr2);
      printf("MID %s\n",MID);
      printf("Datum %s\n",Date);
      printf("Time1 %s\n",Time);
      printf("Fehlercode %s\n",error);
    }
    

    Die Ausgabe sieht dann wie folgt aus

    DATETest 20060516
    MID 1000
    Datum
    Time 152219
    Fehlercode 0

    Das beispiel ist nicht schön ich weiß, aber ich habe nach den vielen Fehlversuchen alles an Schleifen und Verzweigungen rausgenommen, um den Fehler zu finden,genützt hat es leider nichts.

    Bei "Datetest" gibt er das richtige aus, am Ende bei "Datum" nicht mehr.
    Das Zerlegen soll für die Zeilen einer Datei stattfinden, dabei läuft die funktion 5 mal durch, danach gibt es nur noch speichermüllausgaben und fehlermeldungen und das programm schmiert ab.

    Ich wär euch wirklich dankbar, wenn ihr mir sagen könnt was ich da falsch mache.

    Gruß Yoda



  • Du hast deine Arrays etwas zu klein gewählt. Da fehlt der Platz für das abschließende \0 - und dadurch überschreibst du teilweise benachbarte Variablen.



  • Das war der Fehler 🙂

    Vielen Dank.

    Gruß Yoda


Anmelden zum Antworten