Go Down

Topic: String teilen ohne strtok (Read 208 times) previous topic - next topic

juergen01

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


Code: [Select]
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() {
 

}

Tommy56

Warum willst Du das ohne strtok machen?

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

juergen01

#2
Nov 14, 2019, 04:28 pm Last Edit: Nov 14, 2019, 11:36 pm by uwefed Reason: korrigiert. Uwe
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



Tommy56

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

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

agmue

Ein Versuch:

Code: [Select]
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() {}
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Tommy56

#5
Nov 14, 2019, 04:53 pm Last Edit: Nov 14, 2019, 04:54 pm by Tommy56
Mit strtok auf WEMOS D1 mini (IDE 1.8.10 mit ESP8266 Versiopn 2.5.2)
Code: [Select]

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:
Code: [Select]

Start
Acde
A1
3.B1
90000
Ende


Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

michael_x

Meinst du sowas ?

Code: [Select]
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:

Code: [Select]
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() {}
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

juergen01

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


Code: [Select]

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:
Code: [Select]

Start
Acde
A1
3.B1
90000
Ende


Gruß Tommy
Mit strtok auf WEMOS D1 mini (IDE 1.8.10 mit ESP8266 Versiopn 2.5.2)
Code: [Select]

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:
Code: [Select]

Start
Acde
A1
3.B1
90000
Ende


Gruß Tommy

juergen01

#9
Nov 15, 2019, 02:23 am Last Edit: Nov 15, 2019, 02:58 am by juergen01
Meinst du sowas ?

Hallo Michael X


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




Code: [Select]
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 !

juergen01

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


gregorss

#11
Nov 15, 2019, 05:59 am Last Edit: Nov 15, 2019, 06:01 am by gregorss
Zweiter Versuch: ...
Falls Du es noch nicht gemerkt hast: Du antwortest innerhalb der Quote-Tags - das ist suboptimal :-)

Gruß

Gregor
„Ich glaube, ich leg' mich noch mal hin", sagte das Bit.

Tommy56

@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
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

juergen01

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

agmue

Danke für die Rückmeldung :)
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Go Up