Hallo, ich empfange bereits meine GPS Daten mit meinem µC und speicher sie in einem string. Dieser wird dann unverändert zurückgesendet. Nun wollte ich wissen wie ich in C meine empfangenen Daten, ein Beispiel: $GPGGA,175827,4444.5956,N,55555.3461,E,1,05,02.8,00059.5,M,043.1,M,,*41 trennen kann. Jeder der einzelen 15 Werte, die von kommas getrennt werden, soll in einer eigenen Varibalen abgespeichert werden. Wie soll ich dann rangehen in C????? kleinen Tipp bitte Meine Überlegung war es die Postion der Kommas im string abzuspeicher und die Werte so einzeln abzuspeichern, gibts vielleicht eine bessere Lösung???
Bach schrieb: > Meine Überlegung war es die Postion der Kommas im string abzuspeicher > und die Werte so einzeln abzuspeichern, gibts vielleicht eine bessere > Lösung??? Kommt drauf an, was du dann weiter machen willst. Mittels strtok() kann man den String zb in Einzelteile aufsplitten und sich jeweils Pointer auf die Teilstrings merken. Man könnte auch mit strchr() die Positionen der Kommas rausfiltern und mit strncpy() die Einzelteile in neue String-Variablen rauskopieren. Oder bei den Zahlenkomponenten einen atoi gleich auf die Stringpositionen nach dem Komma ansetzen oder die eierlegende Wollmilchsau sscanf drauf ansetzen oder ....
hatte das schon scanf probiert z.b.: char wert1, wert2, wert3, wert4, wert5; scanf("%s,%s,%s,%s,%s", &wert1, &wert2, &wert3, &wert4, &wert5); printf("%s",wert1); printf("%s",wert2); printf("%s",wert3); printf("%s",wert4); printf("%s",wert5); Aber da schmiert mir bei der Probe Dev-C++ ab :-(
char wert1, wert2, wert3, wert4, wert5; Seit wann ist ein char ein String?
falsch kopiert aber hab trotzdem char davor. was muss da sonst hin??? char wert1[10]; char wert2[10]; char wert3[10]; char wert4[10]; char wert5[10];
Karl heinz Buchegger schrieb: > Kommt drauf an, was du dann weiter machen willst. > > Mittels strtok() kann man den String zb in Einzelteile aufsplitten und > sich jeweils Pointer auf die Teilstrings merken. Man könnte auch mit > strchr() die Positionen der Kommas rausfiltern und mit strncpy() die > Einzelteile in neue String-Variablen rauskopieren. Oder bei den Im Prinzip schon die Vorgehensweise, die ich auch wählen würde, aber vielleicht ein wenig zu "oversized". Ich würde einfach nach den Komma-Positionen mit Hilfe des ASCII-Codes suchen - also nach der 0x2c, mir gleichzeitig die Abstände merken und dann die Teilstrings rauskopieren. Und dann halt mit atoi() in ein Integer umwandeln oder wieder per ASCII (x-48*10^z; z = Stelle) berechnen: Eine 12 wäre in ASCII dann [49 | 50]. Die Umrechnung ((50-48)*1)+((49-48)*10) ergibt dann 12. Man müsste mal schauen, ob das dann vielleicht etwas platzsparender wäre, als die entsprechenden Bibliotheksfunktionen zu benutzen...
Bach schrieb:
> hatte das schon scanf probiert
Warum nicht sscanf()? scanf() liest vom stdin. Wenn Du einen String
auslesen willst, dann solltest Du sscanf() benutzen.
Also so:
1 | sscanf(quellstring, "(%i,%i,%i)", &int_wert1, &int_wert2, &int_wert3); |
oder:
1 | sscanf(quellstring, "(%s,%s,%s)", string_pointer1, string_pointer2, string_pointer3); |
Bach schrieb: > falsch kopiert aber hab trotzdem char davor. > was muss da sonst hin??? Es ist immer schwer, in falsch ins Forum kopiertem Nicht-Quelltext Fehler zu finden :-) > aber vielleicht ein wenig zu "oversized". Möglich. Auf der anderen Seite werden die Stringfunktionen hier so oft benutzt, dass das bischen Overhead das Kraut wahrscheinlich nicht fett machen wird. Man könnte auch so etwas machen
1 | char Id[10]; |
2 | char Timestring[10]; |
3 | char Latitude[10]; |
4 | char North[5]; |
5 | char Longitude[10]; |
6 | char East[5]; |
7 | |
8 | char* Extract( char * From, char * To ) |
9 | {
|
10 | if( From ) { |
11 | while( *From && *From != ',' ) |
12 | *To++ = *From++; |
13 | }
|
14 | |
15 | *To = '\0'; |
16 | |
17 | if( From && *From ) // skip ',' if it is there (not end of string) |
18 | From++; |
19 | |
20 | return From; |
21 | }
|
22 | |
23 | int main() |
24 | {
|
25 | char Record[] = |
26 | "$GPGGA,175827,4444.5956,N,55555.3461,E,1,05,02.8,00059.5,M,043.1,M,,*41"; |
27 | |
28 | char* tmp = Record; |
29 | tmp = Extract( tmp, Id ); |
30 | tmp = Extract( tmp, Time ); |
31 | tmp = Extract( tmp, Latitude ); |
32 | tmp = Extract( tmp, North ); |
33 | tmp = Extract( tmp, Longitude ); |
34 | tmp = Extract( tmp, East ); |
35 | ...
|
und hätte damit Kopieren und Erkennen des ',' in einem Rutsch erledigt (Fehlerbehandlung wäre noch verbesserungswürdig)
warum erfindet Ihr immer alles von neuem? Ich meine, GPS-Parser gibts wie Sand am Meer. zB Gpsbabel. -Michael
Das Thema ist dermassen von trivial... zwischen zwei kommas hat's ne zahl...
Hi >Das Thema ist dermassen von trivial... zwischen zwei kommas hat's ne >zahl... Nicht unbedingt. Aber selbst in Assembler hatte ich damit keine Probleme. MfG Spess
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.