String zerlegen (strtok)
-
Hallo,
ich möchte beispielsweise folgenden String zerlegen:
1001,Name,Vorname,PLZ,Wohnort,Telefon
Ich habe vorerst strtok verwendet, anhand des Separators "," wird dann der String in einzelne Token zerlegt. Funktioniert soweit gut, aber nicht in allen Fällen:
Wenn der String anders aussieht (was er auch darf!), wie z.B.:
1001,Name,Vorname,PLZ,,Telefon
,Name,Vorname,PLZ,,TelefonAlso auf ein Komma folgt ein Komma: In diesen Fällen wäre keine Angabe gemacht worden (ohne Leerzeichen).
Strtok ignoriert das und geht einfach weiter. Ich möchte aber, das in einem solchen Fall das Token ein leerer String ist. Kann man das irgendwie mit strtok hinbiegen oder muss ich mir da eine andere Lösung einfallen lassen?
Gibt es Alternativen?
-
hi,
ja klar gibts alternativen, eine davon ist: string selbst parsen
-
Sylexx schrieb:
Kann man das irgendwie mit strtok hinbiegen oder muss ich mir da eine andere Lösung einfallen lassen?
Gibt es Alternativen?Nein.
Ja.
Ja:int ctok(const char *s,char c,char ***r) { int i=0; while( *r=realloc(*r,++i*sizeof*r) ) if( strchr(s,c) ) { memcpy((*r)[i-1]=calloc(1,strchr(s,c)-s+1),s,strchr(s,c)-s); s=strchr(s,c)+1; } else { strcpy((*r)[i-1]=malloc(strlen(s)+1),s); break; } return i; } int main() { char *s="1,2,3,,4,5", **r=0; int i=ctok(s,',',&r); while( i-- ) puts(r[i]),free(r[i]); free(r); return 0; }
-
@Wutz: Du weisst schon, dass dein Code langsamer ist als ein strtok, bei dem leere Token manuell entfernt wurden?
-
hab gerade
estrtok
(empty-strtok) geschrieben, welche auch Empty ("") Tokens zurückgibt. Sie verhält sich sonst genauso wie strtokchar *estrtok(char *str, const char *delim) { static char *last = NULL; char *ret; if(str) last = str; else { if(!last) return NULL; last++; } ret = last; for(;;) { if(*last == 0) { last = NULL; return ret; } if(strchr(delim, *last)) { /* token found */ *last = 0; return ret; } last++; } }
-
Ohh, man Wutz, mir wird schwindelig...ich liebe ja auch Zeigerfummeleien, aber das ist "saugeil"...mein respekt.
Hast Du das geschrieben oder haste dat von irgendwo her?