5 Stimmen

Strtok() und leere Felder

Ich serialisiere eine C-Struktur in einen String und deserialisiere sie dann mit strtok(). Aber leider erkennt strtok() keine leeren Felder (z.B. 1:2::4).

Gibt es eine alternative Funktion?

11voto

Drakosha Punkte 11577

Auf Linux gibt es strsep.

Die Funktion strsep() wurde als Ersatz für strtok() eingeführt, da letztere keine leeren Felder verarbeiten kann. Jedoch entspricht strtok() den Standards C89/C99 und ist daher portabler.

8voto

Tronic Punkte 10002

Sie können strchr (für nur ein Begrenzungszeichen) oder strcspn (für eine Gruppe möglicher Begrenzungszeichen) verwenden, um das nächste Begrenzungszeichen zu finden, das Token zu verarbeiten und dann einfach einen Schritt nach vorne zu gehen. Machen Sie dies in einer Schleife und Sie haben, was Sie brauchen.

0voto

Andreas L. Punkte 2620

Drakosha hat die richtige Antwort gegeben. Ich möchte ein Beispiel für beide Varianten hinzufügen.

Mit strtok:

char *token;
char *tmp_string;
char delimiter[10] = " |,.:";
strcpy (tmp_string, "1:2::4");
token = strtok(tmp_string, delimiter); // erster Token
while(token != NULL) {
    i++;
    printf ("i=%d\tToken: len(%d)\t%s", i, strlen(token), token);
    // etwas machen
    token = strtok(NULL, delimiter); /* nächster Token */
}

Mit strsep (erkennt ""):

char *token;
char *tmp_string;
char delimiter[10] = " |,.";
strcpy (tmp_string, "1:2::4");
token = strsep(&tmp_string, delimiter); // erster Token
while(token != NULL) {
    i++;
    printf ("i=%d\tToken: len(%d)\t%s", i, strlen(token), token);
    // etwas machen
    token = strsep(&tmp_string, delimiter); /* nächster Token */
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X