strtok
-
Hallo Zusammen,
was liefert ein strtok() wenn das Token leer ist?
Ich habe eine config Datei, die zeilenweise zwei delimeters hat:# delim1:"=", delim2:"\n" param_name=param_value\n
Mein code zum parsen:
while( counter++ < CONFIG_PARAM_NO){ /* get line from config handle */ fgets( buffer, 128, cfg_h); /* lese den "param_name" ein */ ptr = strtok(buffer, "="); /* lese den "param_val" ein.. was liefert strtok wenn param_val==""?*/ ptr = strtok(NULL, "\n"); /* temporaere String, init */ tmp.s = ptr ; tmp.len = strlen(ptr); /* duplicate string structure in the config str array*/ str_dupl( &tmp, (cfg+counter), TRUE) ; .... }
Das problem taucht auf, wenn
param_name=\n
in der config Datei gegeben wird. Dabei erwarte ich in solchen Situationen
einen NULL Zeiger aus strtok() zurückgeliefert. Das ist aber nicht so, habe
ausprobiert, ich bekomme einen nicht-NULL zeiger.Danke
-
man: strtok gibt erst den Stringpointer (also
buffer
) zurück. Erst beim nächsten Aufruf NULL.
-
rüdiger schrieb:
man: strtok gibt erst den Stringpointer (also
buffer
) zurück. Erst beim nächsten Aufruf NULL.Mittlerweile denke ich, dass ich besser mit fscanf dran bin. Ich habe die
offene file stream von dem ich zwei "=" getrennten strings auslesen muss. Wie
muss der format dafür aussehen?[enable_signature]=yes\n
möchte ich in zwei verschiedene Puffern wie "[enable signature]" und "yes"
einlesen. Ich habe viele verschiedene formats ausprobiert, aber fscanf hat
immer wieder versagt.Versuch:
fscanf(cfg_h, "%s=%s\n", cfg_parm, cfg_val);
oder
fscanf(cfg_h, "[%s]=%s\n", cfg_parm, cfg_val);
Woran scheitert fscanf mit solchen Formaten?
Danke,
-
visitor007 schrieb:
möchte ich in zwei verschiedene Puffern wie "[enable signature]" und "yes"
einlesen. Ich habe viele verschiedene formats ausprobiert, aber fscanf hat
immer wieder versagt.So geht's:
fscanf (cfg_h, "[%[^]]%*2s%s", cfg_parm, cfg_val);
Erklärung:
Das erste [ ist ja klar. Danach (%[^]]) liest er alles ein, bis auf ein ], wo er auch stoppt. Dann liest er zwei weitere Zeichen ein (] und =), die allerdings, wegen des Sternchens, ignoriert und nicht gespeichert werden. Als letztes kommt dann noch der String mit dem Wert.visitor007 schrieb:
Versuch:
fscanf(cfg_h, "%s=%s\n", cfg_parm, cfg_val);
oder
fscanf(cfg_h, "[%s]=%s\n", cfg_parm, cfg_val);
Woran scheitert fscanf mit solchen Formaten?
Danke,Wenn du einen String einliest, hält dieser i.d.R. erst bei einem Whitespace oder nach einer bestimmten (festgelegten) Anzahl von Zeichen.
Vielleicht hilft dir das: http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/
Gez. monstermunchkin