Zeichenkette in Stringvariable suchen

Hallo

Ich habe meinen Arduino mit einem Bluetoothmodul HM-10 verbunden.
Beim Scan erhalte ich am Ende eine Stringvariable in meinem Programm, die das Ergebnis enthält.
Momentan sieht der Inhalt z.B. so aus.
OK+DISCSOK+DIS0:7C2F80C3912COK+NAME:Gigaset G-tag
Nun würde ich gerne diese Variable nach der Zeichenkette „7C2F80C3912“ durchsuchen
Um zu sehen ist das entsprechende Gerät anwesend.
Ich habe jetzt schon einiges gegoogelt, habe aber noch nix gefunden was funktioniert hätte.
Bisher habe ich immer mit einem Basic Dialekt gearbeitet und da war so etwas kein Problem. :slight_smile:

Wie würdet ihr den so etwas lösen, das kann doch nicht so schwierig sein, oder ?

Ich würde mich über jede Anregung freuen

BYe André

strstr() sollte dein Problem lösen können wenn Du char-Arrays verwendest.
Verwendest Du für die Strings den Arduino-Typ 'string' ist substring() das Mittel der Wahl.

Du suchst das StringObject.

Gruß Tommy

MicroBahner:
strstr() sollte dein Problem lösen können wenn Du char-Arrays verwendest.
Verwendest Du für die Strings den Arduino-Typ 'string' ist substring() das Mittel der Wahl.

Bei substring musst Du die Startposition wissen. Es gibt bessere Methoden zur Suche.

Gruß Tommy

ja, einfach char-Arrays und die strstr() Funktion ist definitiv die bessere und flexiblere Variante.

Wulewatsch:
... Bisher habe ich immer mit einem Basic Dialekt gearbeitet und da war so etwas kein Problem. :slight_smile:
... Wie würdet ihr den so etwas lösen, das kann doch nicht so schwierig sein, oder ?

Naja ... Basic ... seit ich goto verachte, ist Basic für mich passé.

In C/C++ ist das, was Du möchtest eigentlich wirklich nicht schwierig. Der Algorithmus passt jedenfalls auf ein A4-Blatt. Aber weil ich bislang nur sehr wenig mit C-Strings (char-Arrays) zu tun hatte, weiß ich nicht, ob es eine passende Standardfunktion für die Substring-Suche gibt.

Es gibt hier aber ein gutes und kleines Beispiel für eine solche Suche.

Gruß

Gregor

Hallo

ich weiß das Basic etwas angestaubt klingt, aber Purebasic ist wirklich super.

Ich hoffe das ich C noch lerne, ist in meinem Alter schon schwieriger. :slight_smile:

Ich habe die Variable mit String E; definiert.

strstr () hat nicht funktioniert weil ich einen String nicht in einen Char laden kann, oder ähnlich.

Sorry ist aber wirklich absolutes Neuland für mich.

Den Rest werde ich mir heute Abend mal ansehen.

Danke

BYe André

Wulewatsch:
ich weiß das Basic etwas angestaubt klingt, aber Purebasic ist wirklich super.

Ein Freund von mir schwärmt manchmal immer noch von der „Final Cartridge“, die er für seinen C64 hatte. Aber der rechnet auch noch immer wieder Euro in D-Mark um.

Wulewatsch:
Ich hoffe das ich C noch lerne, ist in meinem Alter schon schwieriger. :slight_smile:

Sei froh, dass Du alt genug geworden bist, um Dich noch mit C beschäftigen zu können :slight_smile:

Wulewatsch:
Ich habe die Variable mit String E; definiert.
strstr () hat nicht funktioniert weil ich einen String nicht in einen Char laden kann, oder ähnlich.

Ach so. Das Programm im von Dir verlinkten Thread hat auf mich den Eindruck gemacht, als würde am Ende alles in einem C-String landen.

Du kannst ein String-Objekt zu einem C-String machen, indem Du die Methode c_str() verwendest.

Gruß

Gregor

MicroBahner:
ja, einfach char-Arrays und die strstr() Funktion ist definitiv die bessere und flexiblere Variante.

Da er in seinem Sketch mit der Stringklasse arbeitet, meinte ich eigentlich indexOf() als besser geeignet, als substring().

Ansonsten hast Du Recht, Char-Arrays sind besser als Stringobject.

Gruß Tommy

Wulewatsch:
Wie würdet ihr den so etwas lösen, das kann doch nicht so schwierig sein, oder ?

Ich würde mich über jede Anregung freuen

Die String-in-String-Suche gehört zur Standard-Zeichenkettenverarbeitung.

Falls Du mit nullterminierten Strings (nullterminierte char-Arrays) der Programmiersprache C/C++ hantiert, dann heißt die Funktion zum Suchen eines Strings in einem anderen String strstr(). Diese liefert als Ergebnis einen Pointer zurück, oder NULL, falls der gesuchte String nicht enthalten ist.

Wenn Du aber mit diesem unsagbaren BULLSHIT vonString-Objekten arbeitest, dann wäre das die Funktion, um ein String-Objekt daraufhin zu testen, ob ein bestimmtes anderes String-Objekt oder ein anderer String darin enthalten ist:

Tommy56:
Da er in seinem Sketch mit der Stringklasse arbeitet, meinte ich eigentlich indexOf() als besser geeignet, als substring().

Upps, so genau hatte ich nicht hingeschaut, sorry :-[ . Und mit der Arduino Stringklasse hatte ich mich auch noch nicht näher beschäftigt, weil ich die für ausserst überflüssig halte :wink:

c_str() geht wie gesagt manchmal als Abkürzung um die oft völlig unpraktischen Methoden der String Klasse zu vermeiden. Jedenfalls wenn man nur Lese-Zugriff auf das interne Array braucht

void setup()
{
  Serial.begin(9600);

  String str = "OK+DISCSOK+DIS0:7C2F80C3912COK+NAME:Gigaset G-tag";

  if (strstr(str.c_str(), "7C2F80C3912") != NULL)
  {
     Serial.println("answesend");
  }
}

void loop()
{
}

indexOf() liefert -1 wenn der Teil-String nicht vorhanden ist. Also kann man abfragen ob der Rückgabewert > 0 ist. In dem Fall reicht das. Aber wenn danach mehr mit dem String machen will ist indexOf() nicht schön

Hallo

ja indexOf passte am besten zu meinem bestehenden Code.
Mein Programm macht nun das was es soll.

Danke für eure Mühe.

Ein Char Array hatte ich mir auch noch einmal angeschaut.
Da muß ich aber wissen wie groß die Variable werden soll.
In dem verwendeten Fall kann das Bluetoothmodul bis zu 6 Gegenstellen identifizieren.
Ich müßte also einen relativ hohen Wert annehmen falls wirklich 6 Gegenstellen gefunden werden.
Wird nur eine gefunden wäre es unnütz groß dimensioniert.

So nun muß ich den Arduino nur noch an meine Homematic anschließen und eine Anwesenheitserkennung
sollte zuverlässig funktionieren.

BYe André

Wulewatsch:
Ein Char Array hatte ich mir auch noch einmal angeschaut.
Da muß ich aber wissen wie groß die Variable werden soll.

Ja, C-Strings sind was die Zahl der Zeichen angeht ziemlich blöd zu handhaben. Deshalb habe ich bislang fast alles mit Strings gelöst, was sonst nie ein Problem war, weil ich sonst z. B. auf einem PC mit ein paar GB RAM programmiere. Da ist das mit den vielen bzw. wenigen Bytes keine so kritische Sache.

Gruß

Gregor

Spät dran, aber wenn's mal einer sucht...

  int stringcontains(String str1, String str2)  {
    int found = 0;
    String substr = "";
    int strdiff = str1.length()-str2.length();
    if (strdiff < 0) {
      return 0;
    }
    for (int i=0; i <= strdiff; i++){
      substr = str1.substring(i, i+str2.length());
      if (substr.equals(str2)){
        ++found;
      }      
    }
    return found;
  }

Serenifly:
indexOf() liefert -1 wenn der Teil-String nicht vorhanden ist. Also kann man abfragen ob der Rückgabewert > 0 ist. In dem Fall reicht das. Aber wenn danach mehr mit dem String machen will ist indexOf() nicht schön

Ich würde sagen >= 0. Der gesuchte Teilstring könnte ja am Anfang stehen.

Gruß Tommy

Weiß gar nicht, was ihr alle gegen Goto habt?

Ich finde das ganz praktisch!
Bild

noiasca:
word!

Emacs! vi! Notepad!

Gruß

Gregor

Wenn notepad, dann notepad++.

Die vi-Referenztasse habe ich noch hier stehen. Das EMACS-Referenzfass passt nicht auf den Schreibtisch :wink:
Wie jemand mal irgendwo schrieb: Dem Betriebssystem EMACS fehlt nur eins: Ein brauchbarer Editor.

Gruß Tommy

Tommy56:
Dem Betriebssystem EMACS fehlt nur eins: Ein brauchbarer Editor.

Mit „Editor“ meinst Du bestimmt so etwas Praktisches wie

copy con: bla

oder?

SCNR

Gregor