String teilen ohne strtok

Hallo Zusammen

Habe da ein kleines Problem möchte einen Charstring an denn Trennzeichen teilen
Möchte es ohne strtok machen wenn Ich das folgende Listing ausführe bekomme Ich nur den
letzten Teilstring in allen neuen Teilstrings

Ich danke Euch schon mal

char array[] = "Acde;A1;3.B1;90000;";
char* strings[10];
char neustrings[30];
byte indexa = 0;
byte indexb = 0;
void setup()
{
       Serial.begin(9600);
       
      for(int ii = 0; ii < strlen(array); ii++)
       {
       if(array[ii] > 32 && array[ii] < 132)
        {
          if(array[ii] == 59)
           {
            neustrings[indexa] = '\0';
            strings[indexb] = neustrings; 
            indexb++;indexa = 0;
            }
          else
           {  
          neustrings[indexa++] = array[ii];
          
           }
         }  
       }
       
        Serial.println( strings[0]);
        Serial.println(strings[1]);
        Serial.println( strings[2]);
  }
    void loop() {
  

}

Warum willst Du das ohne strtok machen?

Gruß Tommy

Tommy56:
Warum willst Du das ohne strtok machen?
Gruß Tommy

Hallo Tommy der ESp8266 mag es nicht so sehr wenn Ich den String Teile macht es einen Softreset
wenn mehr Abfragen sind alss der String hat und Ich kann die Strings nach der Serialuebertragung direct
Übernehmen

Gruss juergen

Dann machst Du was falsch. Bei mir hat der strtok immer gemacht.

Gruß Tommy

Ein Versuch:

char array[] = "Acde;A1;3.B1;90000;";
char * strings[10];
byte indexb = 0;

void setup()
{
  Serial.begin(9600);
  Serial.println(array);
  Serial.println();
  strings[indexb] = strtok (array, ";");
  while ((strings[indexb] != NULL) && (indexb < 3))
  {
    Serial.print(indexb); Serial.print('\t'); Serial.println(strings[indexb]);
    indexb++;
    strings[indexb] = strtok (NULL, ";");
  }
  Serial.println();
  for (byte j = 0; j < indexb; j++)
  {
    Serial.println( strings[j]);
  }
}

void loop() {}

Mit strtok auf WEMOS D1 mini (IDE 1.8.10 mit ESP8266 Versiopn 2.5.2)

char array[] = "Acde;A1;3.B1;90000;";

void setup() {
Serial.begin(115200);
Serial.println("\nStart");
char *ptr;
  ptr = strtok(array,";");
  while (ptr != NULL) {
    Serial.println(ptr);
    ptr = strtok(NULL,";");
  }  
 Serial.println("Ende");
}

void loop() {}

Ergibt als Ausgabe:

Start
Acde
A1
3.B1
90000
Ende

Gruß Tommy

Meinst du sowas ?

char array[] = "Acde;A1;3.B1;90000;"; // das letzte ; ist optional !
char* strings[10];  // Ergebnis: 4 Teile {"Acde" "A1" "3.B1" "90000"}

int teilen(char* input, char* result[], char sep) {
 char* p = input;
 if (*p == 0) return 0;
 result[0] = p;
 while (*p != sep && *p != 0)p++;
 if (*p == sep) {
 *p++ = 0;
 return 1 + teilen(p, result + 1, sep);
 }
 else return 1;
}

void setup() {
   Serial.begin(9600);
   int parts = teilen(array, strings, ';');
   Serial.print(parts); Serial.println(" Teile: ");
   for (auto p:strings) 
       if (p) Serial.println(p);
       else Serial.println (" --- ");
}

strtok ist besser, da nicht rekursiv !

Zweiter Versuch:

char array[] = "Acde;A1;3.B1;90000;";
char neustrings[10][30];
byte indexa = 0;
byte indexb = 0;
void setup()
{
  Serial.begin(9600);
  Serial.println(array);
  Serial.println();

  for (byte ii = 0; ii < strlen(array); ii++)
  {
    if (array[ii] > 32)
    {
      if (array[ii] == ';')
      {
        neustrings[indexa][indexb] = '\0';
        indexa++; indexb = 0;
      }
      else
      {
        neustrings[indexa][indexb++] = array[ii];
      }
    }
  }

  Serial.println( neustrings[0]);
  Serial.println( neustrings[1]);
  Serial.println( neustrings[2]);
  Serial.println( neustrings[3]);
}
void loop() {}

Tommy56:
Mit strtok auf WEMOS D1 mini (IDE 1.8.10 mit ESP8266 Versiopn 2.5.2)

Hallo Thommy

Ich benutze 1.6.5 möchte keine andere benutzen muss dann den Code ändern weil
die libraries sich verändert haben kompilieren dauer länger Ich hänge @;@;
dieses dran dann Läuft es

Für Arduino habe Ich die 1.5.7 die libraries werden nicht auf dem System
verteilt und ist schön schnell

Dein Beispiel hatte Ich vorher getestet stürzt ab warum soll Ich über Serial
einen String einlesen ZB 40 Byte den Ich nur für strtok brauche da kann
Ich besser direct in Teilstrings einlesen

Gruss Juergen

char array[] = "Acde;A1;3.B1;90000;";

void setup() {
Serial.begin(115200);
Serial.println("\nStart");
char *ptr;
 ptr = strtok(array,";");
 while (ptr != NULL) {
   Serial.println(ptr);
   ptr = strtok(NULL,";");
 }  
Serial.println("Ende");
}

void loop() {}




Ergibt als Ausgabe:


Start
Acde
A1
3.B1
90000
Ende




Gruß Tommy

Tommy56:
Mit strtok auf WEMOS D1 mini (IDE 1.8.10 mit ESP8266 Versiopn 2.5.2)

char array[] = "Acde;A1;3.B1;90000;";

void setup() {
Serial.begin(115200);
Serial.println("\nStart");
char *ptr;
 ptr = strtok(array,";");
 while (ptr != NULL) {
   Serial.println(ptr);
   ptr = strtok(NULL,";");
 }  
Serial.println("Ende");
}

void loop() {}




Ergibt als Ausgabe:


Start
Acde
A1
3.B1
90000
Ende




Gruß Tommy

michael_x:
Meinst du sowas ?

Hallo Michael X

Ich kann den String wieder zusammensetzen wenn Ich will
Ich danke Dir läuft gut
Gruss Juergen

char array[] = "Acde;A1;3.B1;90000;"; // das letzte ; ist optional !

char* strings[10];  // Ergebnis: 4 Teile {"Acde" "A1" "3.B1" "90000"}

int teilen(char* input, char* result[], char sep) {
char* p = input;
if (*p == 0) return 0;
result[0] = p;
while (*p != sep && *p != 0)p++;
if (*p == sep) {
*p++ = 0;
return 1 + teilen(p, result + 1, sep);
}
else return 1;
}

void setup() {
  Serial.begin(9600);
  int parts = teilen(array, strings, ';');
  Serial.print(parts); Serial.println(" Teile: ");
  for (auto p:strings)
      if (p) Serial.println(p);
      else Serial.println (" --- ");
}




strtok ist besser, da nicht rekursiv !

agmue:
Zweiter Versuch:

Hallo agmue Ich Danke Dir
Versuch 2 hatte Ich vorher so ähnlich getestet

bei Versuch 1 mus man nur die Anzahl der Trennzeichen ermitteln

Gruss juergen

juergen01:
Zweiter Versuch: ...

Falls Du es noch nicht gemerkt hast: Du antwortest innerhalb der Quote-Tags - das ist suboptimal :slight_smile:

Gruß

Gregor

@TO: Mit 1.6.5 ist es früher auch gelaufen. Ich installiere aber jetzt nicht wieder das Alteisen.
Aber ok, wenn Du meinst - Dein Problem.

Gruß Tommy

Hallo Tommy

Du hattest Recht strtok läuft in der 1.6.5 hatte bei der Umwandlung
Von string to Charstring einen Fehler in der Deklaration
hatte array[] geschrieben ohne Wert habe einen wert in die Klammern eingegeben
nun klappt es
line.toCharArray(array, line.length());

Ich Danke Dir

Danke für die Rückmeldung :slight_smile: