mikrocontroller.net

Forum: Compiler & IDEs strsep() selber erstellen


Autor: Christoph S. (kleinerunistudent)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: derChef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Remote One (remote1)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
   Header,145523.00,A,082367.2321,B,12,A*7E
   ^
   |

* An dieser Stelle muss ein '\0' Zeichen rein
   Header,145523.00,A,082367.2321,B,12,A*7E
         ^
         |

* der übergebene Pointer strp
  char* strsep(char** strp, char delim)
  muss nach dem Funktionsaufruf hier hin zeigen
   Header,145523.00,A,082367.2321,B,12,A*7E
          ^
          |

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
   Header,145523.00,A,082367.2321,B,12,A*7E
          ^
          |

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
   Header,145523.00,A,082367.2321,B,12,A*7E
                   ^
                   |

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
   Header\0145523.00\0A\0082367.2321\0B\012\0A*7E
   ^       ^          ^  ^            ^  ^   ^
   |       |          |  |            |  |   |
  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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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"

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.