strsep() selber erstellen

OP #1805985
Lesenswert?

Hallo Leute,

ich habe schon im beitrag 
[[Beitrag "Variables Feld für NMEA Protokoll"]] nach diesem thema 
gefragt, aber mir schien es besser zu sein dafür einen eigenen beitrag 
zu machen.

Also nochmal zu meiner Frage, ich will die strsep funktion selber 
programmieren bzw. ich soll sie selber programmieren und dann noch für 
meinen fall spezifizieren.
Ich bekomme einen string in ca. dieser form:

Header,145523.00,A,082367.2321,B,12,A*7E

jetzt muss ich die Tokens zwischen denn kommas "," in einzelne felder 
schreiben. Leider weiß ich nicht ganz wie ich dieses am besten 
bewerkstelligen soll ?
weil ich soll die zahlen auch sofort als integer bzw. float 
transformieren damit man damit arbeiten kann.

Hat vielleicht jemand ein paar code Beispiele parat denn damit kann ich 
ambesten umgehen, Tipps währen aber auch nicht schlecht.

Vielen dank schonmal,
KleinerUniStudent
#1806008
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren