String parsen mit strtok
-
Hallo!
Habe z.b. folgenden String:
-1d+10h+5m-1s+1h-10m
Habe die Funktion strtok gefunden mit der man schön die unbrauchbaren zeichen extrahieren kann. nun ist es mit strtok möglich, welches zeichen für die aufspaltung des strings gesorgt hat aufzuspüren?denn ansonsten müsste ich mit switch case weiterarbeiten
mfg
ACnut
-
Nein, ist nicht möglich, da strtok den String zerstört und die Trennzeichen mit '\0' überschreibt.
Wenn du die Zahlen ermitteln willst und das Format konstant ist, nimm besser sscanf.
-
hmmm schade
ja die zahlen sollen übernommen werden.
habe das mit scanf auch schon gelesen, allerdings ist das format nicht konstant und die zahlen zu dem jeweiligen präfix zugeordnet gehört(days, hours, minutes and seconds).dann bleibt mir nichts anderes übrig als switch case in kombination mit strcat und strtol zu benutzen xD
nochmals danke für die schnelle Antwort
mfg
ACnut
-
hmmm kann mir jemand erklären wieso das nicht geht?
kriege segmentation fault auf ubuntulong d,h,m,s; char *endp, *str, *pch; char*ch="A"; int i=0; str=argv[2]; for(i;i<=strlen(str);i++) { strcpy(ch,str[i]); printf("%s",ch); switch(str[i]) { case 'd':d+=strtol(bla,&endp,10); bla[0]='\0'; break; case 'h': h+=strtol(bla,&endp,10); bla[0]='\0'; break; case 'm': m+=strtol(bla,&endp,10); bla[0]='\0'; break; case 's': s+=strtol(bla,&endp,10); bla[0]='\0'; break; default:strcat(bla,ch); }
laut debugger liegts am strcpy. kann ich damit leicht nicht einen einzelnen char-string kopieren?
-
strtol ist erstmal schon ein richtiger Weg, aber nicht so, wie du das machst.
strcpy kopiert Strings und keine Zeichen (deshalb auch "str" im Namen).
ch zeigt auf einen nicht änderbaren Speicherbereich, sei froh, dass du eine Fehlermeldung deswegen erhältst.int main() { char *s = "-1d+10h+5m-1s+1h-10m"; long x; errno = 0; while ( x = strtol(s, &s, 10), x!=0 && errno == 0) printf("%ld%c", x,*s++); return 0; }
-
zwar funktioniert es, aber dafür verstehe ich es jetzt nicht
was genau passiert hier?
...strtol(s, &s, 10)...
bzw. wieso funktioniert das?
strtol liefert in der schleife für !isdigit die bisherige zahl in long int und einen pointer auf das nächste symbol. allerdings ist das bei uns jetzt in sich gechlossen, was ich aber nicht verstehe
-
Schau dir die Referenz zu strtol an.
Speziell den zweiten Parameter.
Da bekommst du einen Zeiger auf das Zeichen nach der Zahl zurück.Und lies dir nochmal sscanf durch. Auch was der Specifier
%n
macht.ACnut schrieb:
...und die zahlen zu dem jeweiligen präfix zugeordnet gehört..
Stehen die Buchstaben vor oder hinter den Zahlen?
-
ok, jetzt ist mir das klarer als vorher
danke
das problem bei scanf ist, dass das format bei meinem fall nicht stabil ist.
%n speichert so wie ich das sehe, die bisherige anzahl an gescannten bze. geprinteten zeichen