Datenbank nach Einträgen durchsuchen - for-Schleife & Abbruchbedingung



  • Hallo zusammen,
    ich habe ein Programm geschrieben, das eine Datenbank an Einträgen verwaltet. Eine Funktion soll sein, dass man die Einträge durchsuchen kann und bei passendem Eintrag zurückgegeben wird, dass ein Eintrag vorhanden ist. Mein Problem ist nun der Aufbau der Schleife: Wenn die Einträge mittels for-Schleife durchsucht werden, soll der Vorgang abgebrochen werden, sobald ein passender Eintrag gefunden wurde. Aktuell wird danach aber weitergesucht und für jeden weiteren Eintrag meiner Datenbank "Nicht vorhanden" ausgegeben. Wie muss ich die Abbruchbedingung umformulieren, dass die Schleife bei passendem Eintrag verlassen wird, bei keinem passenden Eintrag aber "Kein Eintrag vorhanden" ausgegeben wird und es nicht endlos weiterläuft? Ich danke euch!

    {
      std::string titelsuche; // @param titelsuche: std::string, der durchsucht werden soll
      for (unsigned int i = 0; i < zDB.size(); i++) //aktuell wird hier also die gesamte Datenbank durchsucht
      {
        titelsuche = zDB.at(i).getTitel(); //die Datenbank liegt in einem Vektor, durch den die for-Schleife iteriert und alle möglichen Einträge ausliest und vergleicht
        if (titelsuche.find(suche)) //passender Eintrag gefunden; @param suche: vom Nutzer eingegebener Suchbegriff
        {
          std::cout << "Eintrag vorhanden" << std::endl;
        }
        else  //kein passender Eintrag gefunden
        {
           std::cout << "Eintrag nicht vorhanden" << std::endl;
        };
      }
    }
    

    Vielen Dank für ein paar Hinweise dazu!



  • Kennst du das Schlüsselwort break bzw. return?

    PS: Dein else ist logisch falsch, denn erst nachdem die Schleife komplett durchlaufen ist, weiß man, ob der Eintrag nicht vorhanden ist.



  • @Th69 Vielen Dank für die schnelle Antwort! break sollte mir auf jeden Fall weiterhelfen. Und das else überdenke ich auch nochmal... danke!!



  • Das ist aber nur ein Test oder? Die Suche sollte sonst sicherlich auf Datenbank-Ebene passieren.



  • if (titelsuche.find(suche))ist falsch. Richtig ist if (titelsuche.find(suche) != std::string::npos).

    https://en.cppreference.com/w/cpp/string/basic_string/npos

    Wenn es sich nicht um eine "Hausaufgabe mit for Schleife" handelt, solltest du std::find_if statt der Schleife verwenden.



  • @manni66 Stimmt! Danke für den Hinweis mit der falschen Bedingung. find_if schaue ich mir auch mal genauer an. Davon habe ich bisher noch nichts gewusst.