0 Pluspunkte 0 Minuspunkte

Ich möchte einen String anhand bestimmter Zeichen teilen und die Teile dann nochmal anhand eines anderen Zeichen teilen.

char str[] = "car_yellow;motorbike_blue;bicycle_green;car_blue";

char *tok = strtok(str, ";");

while(NULL != tok) {

    printf("Eintrag: %s\n", tok);
    
    char *tok2 = strtok(tok, "_");
    
    printf("%s : ", tok2);
    
    tok2 = strtok(NULL, "");
    
    printf("%s\n", tok2);
    
    tok = strtok(NULL, ";");
    
    if(NULL == tok)
        break;
    
}

Das Ergebnis ist aber ganz komisch und zeigt nur den ersten Eintrag.

Eintrag: car_yellow 
car : yellow
von  

1 Antwort

0 Pluspunkte 0 Minuspunkte

Die Funktion strtok verwendet intern einen statischen Zeiger, um den Fortschritt beim Durchlaufen des Strings zu verfolgen. Wenn du strtok erneut auf denselben String anwendest setzt sie den internen Zeiger zurück und beginnt wieder von vorne. Das erklärt, warum nur der erste Eintrag angezeigt wird.  Du kannst z.B strchr in der inneren Schleife verwenden, um "_" in tok zu finden und dann den String an der Position aufteilen.

char str[] = "car_yellow;motorbike_blue;bicycle_green;car_blue";

char *tok = strtok(str, ";");

while (tok != NULL) {
    printf("Eintrag: %s\n", tok);
    
    char *underscore_pos = strchr(tok, '_');
    
    if (underscore_pos != NULL) {
        *underscore_pos = '\0'; // Setze das Unterstrichzeichen auf '\0', um den String zu teilen
        printf("%s : %s\n", tok, underscore_pos + 1);
    }
    
    tok = strtok(NULL, ";");
}
von