Suche in Satz


Hey,
ich hatte schonmal eine Frage bezüglich dieser Aufgabe gestellt und hab darauf super Hilfe bekommen.
Jetzt habe ich folgende Frage:
Der Code-Ausschnitt funktioniert, stoppt aber immer, wenn er das erste mal einen gesuchten uchstaben findet.
Code:
#include <iostream>

#include <string>

using namespace std;

int find(string s, string pattern)

{

    for(int unsigned i=0;i<s.size();i++)

    {

        if(s[i] == pattern[0])

        {
            for(int unsigned j=1;j<pattern.size();j++)

            {

                if(s[i+j] != pattern[j])

                {

                    return -1;

                }

            }   return static_cast<int>(i);

        }

    } return -1;
}

int main()

{

    cout << find("spongebob", "bo") << endl;     //Ausgabe 6  --> Passt

    cout << find("spongebob", "ob") << endl;     //Ausgabe -1 --> Passt nicht

    return 0;

}
So erzeugt die erste Ausgabe die richtige Antwort (return 6), die zweite ergibt aber eins, weil (glaube ich zumindest) nach dem ersten o iin Spongebob geprüft wird, ob der nachfolgende Buchstabe ein b ist. Dies ist er nicht, daher wird -1 (nicht vorhanden) zurückgegeben.

Wie könnte ich die Funktion umschreiben bzw. was müsste man tun, um die Suche zu verbessern?
 

Zvoni

Erfahrenes Mitglied
Eine Variante:
Benutze eine Boolean-Variable in der inneren Schleife, welche du bevor du in die Schleife springst auf False initialisierst.
Die If-Abfrage musst du dann umdrehen:
if(s[i+j]=pattern[ j])

Ablauf wie folgt:
Du springst in die for(i...-Schleife
Prüfung auf den ersten Buchstaben des Patterns erfolgreich --> setze "Gefunden" auf False
Starte die for(j....-Schleife
Prüfe ob s[i+j]=pattern[ j] ist
Falls ja, setze "Gefunden" auf True, Falls nein setze "Gefunden" auf False und beende die for(j...-Schleife
Fahre mit der for(i...-Schleife fort
Nach der for(j...-Schleife prüfe auf "Gefunden", falls False dann return -1 sonst return i

Das ist jetzt nur sehr grob dargestellt, wie ich es unter Umständen machen würde.
 

Zvoni

Erfahrenes Mitglied
Muss mich korrigieren:
Nach der for(j...-Schleife prüfe auf "Gefunden", Falls True return i, falls False --> Fahre mit for(i...-Schleife fort
Nach der for(i...-Schleife prüfe auf "Gefunden", falls False, return -1.
Alle "Gefunden"=True sollten nach der for(j...-Schleife schon mit i zurückspringen.
Du erhälst so aber nur das erste Auftreten des gesuchten Strings
 

Neue Beiträge