Hallo,
Ich habe einen String, den ich mit der C-Funktion strtok_r in
Teilstrings zerlegen will.
In folgendem Beispiel funktioniert das auch wie gewünscht.
1 | char string[50] = "wert1,wert2,wert3,wert4,..."
|
2 | char *tmp;
|
3 | char *feld1;
|
4 | char *feld2;
|
5 | char *feld3;
|
6 | ...
|
7 | feld1=strtok_r(string,",",&tmp);
|
8 | feld2=strtok_r(NULL,",",&tmp);
|
9 | feld3=strtok_r(NULL,",",&tmp);
|
10 | ...
|
Ergebnis ist feld1 zeitgt auf wert1, usw...
Laut Beschreibung ersetzt die Funktion ja nur alle Trennzeichen durch \0
und gibt bei jedem Aufruf einen Pointer auf den nächsten Stringteil
zurück.
Also sieht der String im Speicher vorher so aus:
wert1,wert2,wert3,...wertn\0
Und nachher:
wert1\0wert2\0wert3\0...wertn\0
| | | |
Die zurückgelieferten Zeiger zeigen dann immer auf die mit |
gekennzeichneten Stellen im Speicher.
Nur wenn jetzt im String ein Wert fehlt, also der String z.B. wir folgt
aussieht:
wert1,,wert3,...wertn\0
Dann ist das Ergebnist nicht mehr das von mir erwartete.
Meine Überlegung war, dass dann feld2 am Schluss auf einen leeren String
'\0' zeigen würde und alle anderen Felder ihren eigentlichen "Inhalt"
hätten.
wert1\0\0wert3\0...wertn\0
| | | |
Leider sind jedoch stattdessen alle Felder um eins verschoben, da der
doppelte Trenner übersprungen wird.
wert1\0\0wert3\0...wertn\0
| | |
Ist das ein Bug, oder gewollt? Wenn gewollt, kennt jemand eine andere
Funktion, die das so erledigt, wie ich es machen will? Sonst muss ichs
halt selbst schreiben.
Compiler ist WinAVR in Version 20070122. Laufen soll das auf nem Mega
32(4).
Gruß Holger