Forum: Compiler & IDEs strsep() selber erstellen


von Christoph S. (kleinerunistudent)


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

von derChef (Gast)


Lesenswert?


von Remote O. (remote1)


Lesenswert?

Das klingt mir eher so, als bräuchtest du einfach nur "strtok", oder 
darfst du das nicht nehmen bzw. steht es dir nicht zur Verfügung?!?

EDIT: sehe gerade in deinem anderen Beitrag wurde das schon angemerkt

von Karl H. (kbuchegg)


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.

von Klaus W. (mfgkw)


Lesenswert?

@ Remote One:
Das Thema hatten wir schon mal irgendwie?
strtok geht nicht, weil es auch leere Felder gibt, also
zwei Trennzeichen hintereinander. strtok() liefert dann nichts
und behandelt es wie ein Trennzeichen; es soll aber hier dann ein
leerer String rauskommen.

Die Lösung dazu gab es in diesem Thread: 
Beitrag "Re: GPS-String zerlegen mit C für AVR"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.