In Strings Spliten

Hallo zusammen,

Ich würde gerne einen String Splitten, und das Ergebniss in 4 Verschiedene Strings schreiben.

Das Splitten bei jedem "," Funktioniert eigentlich auch einwandfrei:

char *p = "1,2,3,4,5,";
while ((str = strtok_r(p, ",", &p)) != NULL) // delimiter is the semicolon
    Serial.println(str);

Nur leider erhalte ich dann einfach alle Werte Hintereinander, wie muss ich das nun anstellen das ich die Werte in 4 Strings aufteilen kann. Sodass ich diese Weiterverarbeiten kann.

Gruss Schnibli

Muss p beim zweiten Aufruf nicht NULL sein?

schnibli:
wie muss ich das nun anstellen das ich die Werte in 4 Strings aufteilen kann. Sodass ich diese Weiterverarbeiten kann.

Das kommt ganz darauf an, wie Du es genau machen möchtest, fünf Werte in vier Strings zu splitten.

Mache dafür mal einen Vorschlag!

Natürlich soll der String in 5 geteilt werden! Sozusagen Kommagetrent :slight_smile:

Hab mich da wohl verdrückt :slight_smile:

Ha dann machs doch auch so.

entweder in 5 verschiedene Variablen einlesen mit dem "=" Operator oder mit einer Schleife, ähnlich deiner, in ein Array. Schau dir mal die Beispiele dazu an.

schnibli:
Natürlich soll der String in 5 geteilt werden! Sozusagen Kommagetrent :slight_smile:

Hab mich da wohl verdrückt :slight_smile:

OK, hier mal ein Beispielprogramm.

Du hast anfangs einen String (“Char Array”), und den zerlegst Du in fünf Char-Pointer:

char str[] = "1,2,3,4,5,";
char *p[5];

void setup() {
  Serial.begin(9600);
  Serial.print("str= ");Serial.println(str);

  // Zerlegen
  p[0]=strtok(str,",");
  for (int i=1;i<5;i++) p[i]=strtok(NULL,",");

  // Verarbeiten/Ausgeben der zerlegten Strings
  for (int i=0;i<5;i++) 
  {
    Serial.print(i);Serial.print(":\t");
    Serial.println(p[i]);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
}

Beim “Zerlegen” wird der ursprüngliche String zerstört, indem das Komma-Trennzeichen durch ein Null-Zeichen (“Stringende”) ersetzt wird.

Und heraus bekommst Du einen Char-Pointer, der auf einen nullterminierten String innerhalb des ursprünglichen Char-Arrays verweist.

Alles klar? Oder noch Fragen?

Habe es geschafft :slight_smile:

 // Zerlegen
 p[0]=strtok(message,",");
 for (int i=1;i<5;i++) p[i]=strtok(NULL,",");

  Serial.println(p[0]);
   Serial.println(p[1]);
   Serial.println(p[2]);
  Serial.println(p[3]);
   Serial.println(p[4]);

schnibli:
Habe es geschafft :slight_smile:

Was Du allerdings nicht geschafft hast, ist es, Quellcode innerhalb von Code-Tags zu posten.

Code-Tags fügst Du in einem Beitrag mittels Klick auf das “</>” Icon im Code-Editor ein, und geposteter Code gehört dazwischen.

So hast Du nun leider nur Text gepostet, bei dem ein Array-Index als BB-Code zum Umschalten auf Kursivschrift interpretiert wird, und genau an der Stelle, wo Dein Beitrag von Normalschrift auf Kursivschrift umschaltet, fehlt in der Codedarstellung etwas.

Warum hat das jetzt nicht mit den Code-Tags funktioniert, ganz oben in Deinem Anfangsposting war der Code doch innerhalb von Code-Tags gepostet worden?

Wenn ich genau weiß dass ich N Tokens habe, dann rufe ich da auch gerne strtok() N mal per Hand auf

Vor allem praktisch wenn man die Werte nicht in Arrays speichern will, sondern einzelnen Variablen. z.B.:

char str[] = "100,200,300";

int x = atoi(strtok(str, ",");
int y = atoi(strtok(NULL, ",");
int z = atoi(strtok(NULL, ",");

Wichtig ist eben, dass der erste Aufruf mit der String Variablen erfolgt und alle weiteren mit NULL.

Du hattest ursprünglich strtok_r() verwendet. Da wird der Zeiger auf die Tokens extern verwaltet. Da nimmt man aber besser eine extra Variable dafür und nicht den String. Was auch nicht gehen würde wenn man den String als Array-Variable hat.