Ich erhalte über die serielle Schnittstelle so etwas: BEGirgend_ein_InhaltEND
und möchte "irgend_ein_Inhalt" weiterverarbeiten.
Nun kann ich mit if (strstr(inputStringX," BEG")) ja prüfen ob der String so beginnt, aber nicht BEG entfernen.
Meine Versuche mit strtok sind auch nicht erfolgreich, da dort nach jedem Zeichen aus BEG gesucht wird, es ja aber sein kann, dass eines dieser Zeichen (nicht die Kette) auch im inputStringx vorkommt: Feld1= strtok(inputStringX,"BEG");
Es wäre SUPER nett wenn ihr mir helfen könntet!!!!!!!!!!!!!!!!!!!!!
mit strstr prüftst du, ob "BEG" irgendwo in deinem Eingabestring vorkommt, und kriegst auch die Stelle gesagt.
3 Zeichen weiter ist BEG zu Ende, dazu brauche ich noch nicht mal strlen, das kann ich so abzählen.
Und wenn du weisst, das dein String mit "BEG" beginnt, ist es noch einfacher:
Es geht aber um ein Start-Token und ein Ende-Token und ggf. noch mehr Zeichen dumherum.
Folgender Code kann ein Beispiel dienen, wie man den gewünschten Teil ausschneidet, ohne die "böse" String-Klasse zu verwenden:
const char* start = "*BEG*";
const char* ende = "*END*";
char* test = "1234*BEG*bla blubb hallo*END*56789";
char ziel[20];
void setup() {
Serial.begin(9600);
//finde zeiger auf den "start"-String
char* s = strstr( test, start);
//finde zeiger auf den "ende" string
char* e = strstr( test, ende);
//wenn beide zeiger vorhanden, dann weiter machen
if( s > 0 && e > 0) {
//länge des zielstrings berechnen (ende-adresse - startadresse) abzüglich der 5 zeichen von "*BEG*"
int len = e - s - 5;
//kopieren des ziel-strings. (S + 5) ist dabei der start ohne das "*BEG*"
// len + 1 ist notwendig wegen der \0-terminierung
strlcpy(ziel,(s + 5), len + 1);
Serial.println(ziel);
} else {
Serial.println("start oder ende nicht gefunden");
}
}
void loop() {
}
Wenn wir uns schon ans Fertige-Lösung-Liefern machen, würde ich vorschlagen, auch ohne String-Kopieren auszukommen.
Es ist viel einfacher als mit den bösen String Objekten
const char* start = "*BEG*";
const char* ende = "*END*";
char* test = "1234*BEG*bla blubb hallo*END*56789"; // dieser text liegt im RAM
char* ziel;
void setup() {
Serial.begin(9600);
//finde zeiger auf den "start"-String
char* s = strstr( test, start);
//finde zeiger auf den "ende" string
char* e = strstr( test, ende);
//wenn beide zeiger vorhanden, dann weiter machen
if( s > 0 && e > 0) {
//länge des zielstrings berechnen (ende-adresse - startadresse) abzüglich der 5 zeichen von "*BEG*"
int len = e - s - 5;
//ziel-string (S + 5) ist dabei der start ohne das "*BEG*" und mit abgeschnittenem END
ziel= s + 5;
*e = 0;
Serial.println(ziel);
} else {
Serial.println("start oder ende nicht gefunden");
}
}
void loop() {}
Diese Lösung ist aber "destruktiv", da sie den originalen String verändert. Das geht zwar auch, halte ich persönlich aber nicht für gut, außer ich weiss genau, das die originalen Daten später nicht weiter verarbeitet werden.
Schön, dass du "destruktiv" in Gänsefüßchen gesetzt hast.
So fing das Ganze übrigens an: ( Hallo Herbert, danke für deine Anregung )
Ich erhalte über die serielle Schnittstelle so etwas: BEGirgend_ein_InhaltEND
und möchte "irgend_ein_Inhalt" weiterverarbeiten.
Nun kann ich mit if (strstr(inputStringX," BEG")) ja prüfen ob der String so beginnt, aber nicht BEG entfernen.
In diesem Kontext finde ich meinen Vorschlag, zu zeigen wie einfach man mit char arrays umgehen kann, eher "konstruktiv"
Dass danach der Eingabestring verändert ist, sollte klar sein.
Dass man evtl. den ganzen Eingabestring gar nicht erst speichern muss, was für µC mit kleinem RAM noch besser wäre, habe ich bewusst weggelassen.
michael_x:
Schön, dass du "destruktiv" in Gänsefüßchen gesetzt hast.
Dass danach der Eingabestring verändert ist, sollte klar sein.
Dass man evtl. den ganzen Eingabestring gar nicht erst speichern muss, was für µC mit kleinem RAM noch besser wäre, habe ich bewusst weggelassen.
Hallo Michael_x,
sorry wenn ich mich unglücklich ausgedrückt habe. Das "destruktiv" bezog sich nur auf den String, nicht auf Deine Lösung ansich.
Mit dem Speichern des Eingabestrings hast Du natürlich recht, allerdings hängt das immer stark von der Anwendung ab, von der wir ja gar nichts wissen. Will man den "Nutzinhalt" schon beim Einlesen filtern, müßte man vermutlich anders vorgehen. Vor allem wenn lediglich zeichenweise eingelesen wird.
Mario.