Frage zum Parsen
-
"strtok" ist auch nicht schlecht.
Wenn der Ausgangsstring verändert werden darf, mach ich es auch öfters so, daß ich mir die Länge des Strings abspeichere und alle Delimiter-Zeichen durch '\0' ersetze. Man kann dann schön mit Pointern arbeiten und bekommt schon fertig zurechtgeschnittene Strings zurück.
-
Also erstmal an frag mich ruhig, bruder : Danke für die Erklärung.
die funktion bereitet mir bauchschmerzen. benutz lieber sscanf.
Danke, hab ich versucht, aber das Programm soll auf Mikrocontroller laufen und sscanf hat einen ATMEGA16 irgendwie verrückt gemacht.
"strtok" ist auch nicht schlecht.
Wenn der Ausgangsstring verändert werden darf, mach ich es auch öfters so, daß ich mir die Länge des Strings abspeichere und alle Delimiter-Zeichen durch '\0' ersetze. Man kann dann schön mit Pointern arbeiten und bekommt schon fertig zurechtgeschnittene Strings zurück.
strtok ist mir noch völlig neu, werde erstmal schauen, was das ist.
Aber auf jeden Fall: danke für alle Antworten.
-
obste nu strtok nimmst, oder dir selbst was brätst: wenn du alle aufgeteilten elemente verfügbar haben willst brauchst du sowas wie ein array von char** auf char*.
da steht das dann 'sinnbildlich' in etwa so drin:char** splitted; splitted[0] = "123"; splitted[1] = "ABC";
... usw.
-
Wenn man Gesamtinfo veraendern darf, so kann das erste Komma durch 0 ersetzt werden. Danach wird pOut1 auf den Anfang des Strings gesetzt und pOut2 auf den Rest nach dem Komma. Danach kann der so gewonnene String an andere Funktionen weitergegeben werden und man spart sich unnoetige malloc's. Der Speicher an sich kann aber nur ueber GesamtInfo wieder freigegeben werden.
-
knivil schrieb:
Wenn man Gesamtinfo veraendern darf, so kann das erste Komma durch 0 ersetzt werden. Danach wird pOut1 auf den Anfang des Strings gesetzt und pOut2 auf den Rest nach dem Komma.
sowas brauchts aber nicht selbst zu programmieren, das macht 'strtok' schon.
-
;fricky schrieb:
sowas brauchts aber nicht selbst zu programmieren, das macht 'strtok' schon.
Wenn nicht mal sscanf funktioniert ... auch ist es eine simple for-Schleife.
-
knivil schrieb:
Wenn man Gesamtinfo veraendern darf, so kann das erste Komma durch 0 ersetzt werden. Danach wird pOut1 auf den Anfang des Strings gesetzt und pOut2 auf den Rest nach dem Komma. Danach kann der so gewonnene String an andere Funktionen weitergegeben werden und man spart sich unnoetige malloc's. Der Speicher an sich kann aber nur ueber GesamtInfo wieder freigegeben werden.
Jepp, so hast du aber immer nur einen gesplitteten String verfügbar; es mag aber auch Fälle geben, in denen man mehr als einen benötigt.
-
knivil schrieb:
Wenn nicht mal sscanf funktioniert ... auch ist es eine simple for-Schleife.
sscanf ist wahrscheinlich deshalb nicht verfügbar, weil da eine ziemlich dicke Maschinerie zum Parsen von ganzen und gebrochenen Zahlen in diversen Formaten drin steckt, die bei einem µC unnötig viel Platz wegnimmt. Über andere Libraryfunktionen wie strtok sagt das nichts aus.
-
Das ist korrekt. Ich habe extrapoliert ...
-
Wie wärs mit einer schnuckeligen Splitfunktion, guckst du hier Bruder:
#include <stdio.h> #include <string.h> #include <stdlib.h> char** arr_free ( char** arr, int n ) { if ( !arr ) return NULL; while ( --n >= 0 ) free ( arr[n] ); free (arr); return NULL; } char** arr_addstr ( char** arr, int* n, char* p, int len ) { if ( NULL == ( arr = realloc ( arr, ( *n + 1 ) * sizeof ( char** )))) return arr_free ( arr, *n ); if ( NULL == ( arr[*n] = malloc ( len + 1 ))) return arr_free ( arr, *n ); strncpy ( arr[*n], p, len ); arr[*n][len] = 0; (*n)++; return arr; } char** splitt0r ( char* s, int* n, char* separators ) { char** splitted = NULL; char* p = s, *r = separators; *n = 0; if ( p == NULL ) return NULL; while (*s) { r = separators; while (*r) { if ( *r == *s ) break; r++; } if ( *r == *s ) { if ( NULL == ( splitted = arr_addstr( splitted, n, p, s-p ))) return NULL; p = s+1; } s++; } if ( p != s ) { if ( NULL == ( splitted = arr_addstr ( splitted, n, p, s-p ))) return arr_free (splitted, *n); } return splitted; } void kuggi ( char** arr, int n ) { if ( !arr ) return; while ( --n >= 0 ) printf ("%s\n", arr[n]); } int main() { char* to_split = "I,wanna;be*splitted'0r&what?!"; char* seps = ",;*'&"; char** arr; int n = 0; arr = splitt0r ( to_split, &n, seps ); kuggi (arr, n); arr_free (arr, n); return 0; }
Gru-huß,
f.m.r.b.
-
frag mich ruhig, bruder schrieb:
... char** arr_addstr ( char** arr, int* n, char* p, int len ) { if ( NULL == ( arr = realloc ( arr, ( *n + 1 ) * sizeof ( char** )))) return arr_free ( arr, *n ); ...
Wenn der Speicher frei werden soll, brauchst du ne zweite Variable, denn falls realloc NULL liefern sollte, geht die Adresse flöten:
char** arr_addstr ( char** arr, int* n, char* p, int len ) { char** pp; // <-- Guckst du hier, Bruder. if ( NULL == ( pp = realloc ( arr, ( *n + 1 ) * sizeof ( char** )))) return arr_free ( arr, *n ); else arr = pp;
-
sacht mal leute was soll die ganze scheiße mit den 0's in den nicks und dem code seid ihr 1337 oder was
-
goodquestion schrieb:
sacht mal leute was soll die ganze scheiße mit den 0's in den nicks und dem code seid ihr 1337 oder was
nein brud0r :p
-
Bashar schrieb:
sscanf ist wahrscheinlich deshalb nicht verfügbar, weil da eine ziemlich dicke Maschinerie zum Parsen von ganzen und gebrochenen Zahlen in diversen Formaten drin steckt, die bei einem µC unnötig viel Platz wegnimmt. Über andere Libraryfunktionen wie strtok sagt das nichts aus.
Das wirds wahrscheinlich sein.
Ich beschreibe den µC mit AVR-Studio und das zeigt beim Kompilieren die Auslastung des µC.
Und sobals ich sscanf benutzt hab, schoss diese schlagartig hoch und auch wenn sie nicht 100% erreichte, hat der µC im betrieb schon i-welche Fehler gemacht. Und ich musste ja noch andere Sachen draufpacken.