Ein String in zwei teilen

Hallo,
ich verwende folgenden Code:

char field[20];
  char Lfield[20];
  char LATfield[20];
  char Bfield[20];
  char LONfield[20];
  getField(field, 0);
  if (strcmp(field, "$GPRMC") == 0)
  {  
    getField(LATfield, 3);  // number
    getField(Lfield, 4); // N/S

    getField(LONfield, 5);  // number
    getField(Bfield, 6);  // E/W

    Serial.print("Lat: ");
    Serial.print(Lfield);
    Serial.println(LATfield);
    Serial.print("Long: ");
    Serial.print(Bfield);
    Serial.println(LONfield);
    delay(2000);
  }

Der Arduino gibt dann folgendes aus:

Lat: N5016.21385
Long: E01057.92275

Ich möchte allerdings LATfield und LONfield in jeweis zwei Strings packen. Dies soll dann so aussehen:

LATfield = 50
LATfield2 = 16.21385
LONfield = 010
LONfield2 = 57.92275

Es gibt doch bestimmt eine einfache Funktion hierfür?

Danke :slight_smile:

Hallo JulHa,

ich glaube Du suchst http://arduino.cc/en/Tutorial/StringSubstring.

JulHa:
Es gibt doch bestimmt eine einfache Funktion hierfür?

Hallo,

und wenn Du es mal so probierst:

    Serial.print("Lat: ");
    Serial.println(Lfield);
    Serial.print(Latfield2: ");
    Serial.println(LATfield);

Gruß,
Ralf

JulHa:
Es gibt doch bestimmt eine einfache Funktion hierfür?

Die Stringfunktionen für char-Arrays findest Du hier aufgelistet:
http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html

Mein Codevorschlag:

  char LATfield[20]="5016.21385";
  Serial.println(LATfield);
  char lat1[]="00"; // Zuweisung von irgendwas mit 2 Zeichen und abschließendem Nullzeichen
  strncpy(lat1,LATfield,2);    // Umkopieren der ersten 2 Zeichen
  Serial.println(lat1);
  Serial.println(&LATfield[2]); // String erst 2 Zeichen nach dem Anfang ausgeben)
  Serial.println();

  char LONfield[20]="01057.92275";
  char lon1[]="000";
  strncpy(lon1,LONfield,3);
  Serial.println(lon1);
  Serial.println(&LONfield[3]);

Danke für eure Vorschläge. Habe nun folgenden verwendet: :slight_smile:

jurs:

JulHa:
Es gibt doch bestimmt eine einfache Funktion hierfür?

Die Stringfunktionen für char-Arrays findest Du hier aufgelistet:
avr-libc: <string.h>: Strings

Mein Codevorschlag:

  char LATfield[20]="5016.21385";

Serial.println(LATfield);
  char lat1[]="00"; // Zuweisung von irgendwas mit 2 Zeichen und abschließendem Nullzeichen
  strncpy(lat1,LATfield,2);    // Umkopieren der ersten 2 Zeichen
  Serial.println(lat1);
  Serial.println(&LATfield[2]); // String erst 2 Zeichen nach dem Anfang ausgeben)
  Serial.println();

char LONfield[20]="01057.92275";
  char lon1[]="000";
  strncpy(lon1,LONfield,3);
  Serial.println(lon1);
  Serial.println(&LONfield[3]);

Habe noch folgenden Code hinzugefügt

  if(LATfield3 == "15.963")
    {
        Serial.println("abc");
    }

Warum führt er das nicht aus wenn LATfield3 15.963 ist?

Weil Strings nicht mit == verglichen werden.

Du musst verstehen was C Strings überhaupt sind. Anders als in anderen Sprachen ist das kein komplexer Datentyp. Es ist einfach ein Null-terminiertes Array aus char. Und Arrays sind auch keine komplexen Datentypen, sondern ein Zeiger auf das erste Element. Du vergleicht da einfach die Adressen und die sind natürlich ungleich.

Um Strings zu vergleichen gibt es strcmp():
http://www.cplusplus.com/reference/cstring/strcmp/
http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#ga46f3cbd2de457c0fb340a1f379fc33ba
Die Funktion gibt bei Gleichheit 0 zurück

Das hast du doch in deinem Code schon verwendet:

if (strcmp(field, "$GPRMC") == 0)

Danke,
bin noch Anfänger auf dem Gebiet, besonders was Strings angeht.
Kann ich den String "12.345" zu einer oder zwei Intergers konvertieren, welche dann so aussehen soll: "12345" oder "12" und "345".

Habe ATOI versucht aber da kommt bei gleichen Ausgangswerten eine andere Integer raus?!?! :roll_eyes:

atoi() sollte eigentlich funktionieren

Man kann z.B. das machen:

char str[] = "12.345";
char* punkt = strchr(str, '.');
int vor = atoi(str);
int nach = atoi(punkt + 1);

strchr() sucht dabei nach einem Zeichen und liefert einen Zeiger darauf zurück.

Oder auch:

char str[] = "12.345";
int vor = atoi(strtok(str, "."));
int nach = atoi(strtok(NULL, "."));

Falls die Vorkommastellen immer zwei-stellig sind geht auch einfach:

char str[] = "12.345";
int vor = atoi(str);
int nach = atoi(str + 3);

JulHa:
Habe ATOI versucht aber da kommt bei gleichen Ausgangswerten eine andere Integer raus?!?! :roll_eyes:

Dann hast Du irgendwas falsch gemacht.

Du kannst auch atof() verwenden, um das char-Array in eine Gleitkommazahl zu wandeln.

Könnte es vielleicht sogar sein, dass Du die GPS-Koordinaten in Gleitkommazahlen für Längen- und Breitengrad umwandeln möchtest?

jurs:
Könnte es vielleicht sogar sein, dass Du die GPS-Koordinaten in Gleitkommazahlen für Längen- und Breitengrad umwandeln möchtest?

Entwerder so oder zwei Integers.

Habe nun

char str[] = "12.345";
int vor = atoi(strtok(str, "."));
int nach = atoi(strtok(NULL, "."));

verwendet.

Brauche es als Zahl um einen

if ((vor == 12) && (nach >= 343) && (nach <= 347)

auszuführen, da ich das mit Strings nicht behersche (wenn das denn so leicht geht) :smiley:

Du kannst wie gesagt auch mal das probieren:

float f = atof(str);

Gleitkommazahlen sollte man nicht auf Gleichheit abfragen, aber du du sowieso einen Bereich willst, sollte da auch gehen