Christoph S. schrieb:
> schreiben. Leider weiß ich nicht ganz wie ich dieses am besten
> bewerkstelligen soll ?
Die erste Frage ist:
Was genau möchtest du von strsep übernehmen und was nicht?
> weil ich soll die zahlen auch sofort als integer bzw. float
> transformieren damit man damit arbeiten kann.
das ist noch lange kein Grund ...
> jetzt muss ich die Tokens zwischen denn kommas ","
> in einzelne felder schreiben.
... das da großartig Strings umkopiert werden müssen.
Header,145523.00,A,082367.2321,B,12,A*7E
Beim ersten Aufruf soll strsep (wenn du dich an die Originalvorlage der
Funktionalität hältst) also was machen:
* Der Returnwert soll ein Pointer hier her sein
1 | Header,145523.00,A,082367.2321,B,12,A*7E
|
2 | ^
|
3 | |
|
* An dieser Stelle muss ein '\0' Zeichen rein
1 | Header,145523.00,A,082367.2321,B,12,A*7E
|
2 | ^
|
3 | |
|
* der übergebene Pointer strp
char* strsep(char** strp, char delim)
muss nach dem Funktionsaufruf hier hin zeigen
1 | Header,145523.00,A,082367.2321,B,12,A*7E
|
2 | ^
|
3 | |
|
Welche Sonderfälle gilt es zu beachten?
* Wenn strp schon auf das Ende des ursprünglichen Strings zeigt, darf
natürlich nichts mehr passieren. Erkennbar daran, dass beim Aufruf
der Funktion **strp schon '\0' ist
* Und wenn natürlich ein NULL Pointer übergeben wird, sollte
tunlichst auch nichts passieren.
Beim weiteren Aufruf von strsep sieht die Situation dann so aus. Wie vom
vorhergehenden Aufruf hinterlassen, zeigt strp hier hin
1 | Header,145523.00,A,082367.2321,B,12,A*7E
|
2 | ^
|
3 | |
|
Dieser Pointer ist gleichzeitig der Returnwert dieses Aufrufs, denn hier
fängt ja der nächste Teilstring an.
strsep geht von dieser Position ausgehend weiter Zeichen durch, bis es
auf den Delimiter stösst, welchen es hier antreffen wird
1 | Header,145523.00,A,082367.2321,B,12,A*7E
|
2 | ^
|
3 | |
|
An dieser Position im String kommt wieder ein '\0' Zeichen rein, damit
hat der Aufrufer wieder einen sauberen String, beginnend beim Returnwert
bis zu diesem '\0' Zeichen.
Und natürlich setzt strsep den strp wieder um 1 Stelle weiter (damit es
weiß, wo es beim nächsten Aufruf weiter machen soll)
Das sollte doch nicht so schwer zu realisieren sein.
Letzten Endes bekommt der Aufrufer sukzessive von strsep lauter Pointer
zurück, die in einen modifizierten String zeigen und bei denen jeder
Teilstring sauber mit einem '\0' abgeschlossen ist
1 | Header\0145523.00\0A\0082367.2321\0B\012\0A*7E
|
2 | ^ ^ ^ ^ ^ ^ ^
|
3 | | | | | | | |
|
4 | 1. 2. 3. 4. 5. 6. 7.
|
jeder einzelne dieser Pointer ist perfekt dazu geeignet, dass man ihn zb
direkt in atoi oder dergleichen übergeben kann, denn jeder einzelne der
Pointer zeigt ja auf einen gültigen String, der mit \0 abgeschlossen
ist.
Das diese Teilstrings dadurch entstanden sind, dass man Pointer mitten
in ein char-Array bildet (welches groß genug war), interessiert letzten
Endes niemanden. Pointer ist Pointer und solange dort eine Character
Sequenz anfängt, die mit \0 beendet ist, ist das aus Sicht der
verarbeitenden Funktionen ein perfekter String.