Suche in einem String begrenzen?



  • Ich mag Nudeln aber kein Salz.
    Ich mag keine Kartoffeln aber Zucker.
    Ich mag Bier wie Wein.
    Ich mag Obst wie die Pest.
    Viel Erfolg!



  • Ich tippe auf mehrere if-Abfragen in deinem Programm. Wenn du stattdessen if() esle if() ... benutzt springt er nur in eine Bedingung. 🙂
    Dies ist aber nur geraten. Um dein Problem zu lösen müsstest du wahrscheibnlich deinen Code hier posten.



  • okay, ich denke jezt wird mein Problem klarer,
    ich hätte es von anfang an so machen sollen 😃
    hier ist der Code:

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
    	int found=0;
    	string Anwser="";
    	bool end=false;
    
    	while(end!=true)
    	{
    		getline(cin, Anwser);
    
    		found=Anwser.find("English");
    		if(found!=string::npos)
    		{
    			cout << "English!" << endl;
    		}
    
    		found=Anwser.find("German");
    		if(found!=string::npos)
    		{
    			cout << "German!" << endl;
    		}
    
    		found=Anwser.find("end");
    		if(found!=string::npos)
    		{
    			end=true;
    		}
    	}
    
    	return 0;
    }
    

    wen der Benutzer "German English" eingibt dan wird durch find beides gefunden und auf beides reagiert aber das möchte ich vermeiden, das Programm soll auf das erste was es findet reagieren, in anderen Worten es soll nur einmal pro Eingabe reagieren.



  • Ich musste deine Frage 3 mal lesen, bevor ich es gerafft hab 😃

    Lass den User deinen Satz eingeben.
    Danach könnt ich mir 2 Möglichkeiten vorstellen.

    1. Diesen Satz in seine einzelnen Wörter auftrennen. Diese in einen vector
    speichern. Über diesen Vector iterieren und mit den jeweils definierten Reaktionen abgleichen. (z.B in einer Funktion). Nach dem Abhandeln einer Reaktion
    die Funktion verlassen.

    2. Den Satz als String hernehmen und darin nach deinen Wörtern suchen.
    Bei Treffer die Reaktion abhandeln und auch hier dann Funktion verlassen.

    Bei letzterer Möglichkeit seh ich folgendes Problem.

    "Ich mag Bier wie Wein"

    > Treffer für Wein

    "Ich mag Bier wie Weinbeeren"

    > auch Treffer für Wein ???



  • Erstmal vielen dank Basicman01,
    du hast recht, Weinbeeren sollte nach dem Konzept des Programms kein Treffer sein, das wäre nähmlich das nägste Problem.
    für das Akktuelle Problem glaube ich eine Lösung gefunden zu haben:

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
    	int found=0;
    	string Anwser="";
    	bool end=false;
    	bool first=true;
    
    	for(;end!=true;first=true)
    	{
    		getline(cin, Anwser);
    
    		found=Anwser.find("English");
    		if(found!=string::npos && first==true)
    		{
    			cout << "English!" << endl;
    			first=false;
    		}
    
    		found=Anwser.find("German");
    		if(found!=string::npos && first==true)
    		{
    			cout << "German!" << endl;
    			first=false;
    		}
    
    		found=Anwser.find("end");
    		if(found!=string::npos)
    		{
    			end=true;
    		}
    	}
    	return 0;
    }
    

    sobald das Programm ein Wort gefunden hat, setzt es First auf false. somit weis der rest des Programms das in diesem Schleifen Durchlauf schon ein Wort gefunden worden ist und gehen somit nicht mehr auf weitere Wörter ein. Im Kopf der Schleife wird versichert das nach jedem Durchlauf First wieder auf true gesetzt wird damit das ganze von vorne los gehen kann.
    Dies ist vileicht nicht die eleganteste Art und hat auch eine macke, mann müsste die find-blöcke nach piorität ordnen, den in diesem falle egal in welcher reinfolge ich die beiden Wörter zusammen eingebe ("English German" oder German English") die Ausgabe ist immer "English!". In anderen Worten, Dieser Mechanismus geht nicht nach dem ersten eingetipptem Wort sondern nach dem ersten definiertem Wort in der Schleife.

    Hat jemand noch eine Alternative um dies zu beheben?



  • Vielleicht sowas? Quick and Dirty:

    #include <iostream>
    #include <string>
    #include <sstream>
    #include <vector>
    
    typedef std::vector<std::string> StrVec;
    
    StrVec splitStr(const std::string& str);
    
    int main()
    {
    	bool running = true;
    
    	while (running)
    	{
    		std::string answer;
    
    		std::getline(std::cin, answer);
    
    		StrVec vec = splitStr(answer);
    
    		bool finish = false;
    
    		for (StrVec::iterator it = vec.begin(); it != vec.end(); ++it)
    		{
    			if (!finish)
    			{
    				if (it->find("English") != std::string::npos)
    				{
    					std::cout << "English" << std::endl;
    					finish = true;
    				}
    				else if (it->find("German") != std::string::npos)
    				{
    					std::cout << "German" << std::endl;
    					finish = true;
    				}
    			}
    			else if (it->find("end") != std::string::npos)
    			{
    				running = false;
    			}
    		}
    	}
    
    	return 0;
    }
    
    StrVec splitStr(const std::string& str)
    {
    	StrVec vec;
    
    	std::stringstream strm(str);
    
    	std::string buf;
    
    	while (strm >> buf)
    	{
    		vec.push_back(buf);
    	}
    
    	return vec;
    }
    


  • Wenn du es so machst, dann haben bestimmte Wörter eine höhere Priorität als andere. Bei Deinem Programm hat "English" die höchste Priorität. Ein Eingabe "English German" oder "German English" kommt beides mal "English" heraus. Wenn es das ist, was Du willst, bist Du quasi fertig. Wenn Du allerdings das erste Wort im String nehmen willst, was erkannt wird, dann müsstest Du dir auch die Position merken. Oder eben einfach den Satz in seine Wörter zerlegen und der Reihe nach durchgehen.



  • okay ich habe das Problem gelöst und zwar ähnlich wie opooioi.
    jezt habe ich aber ein zweites und letztes Problem und war genau das worauf mich BasicMan01 schon hingewiesen hat. Wenn eine reaktion für "Wein" definiert ist, dan reagiert das Programm wen die Eingabe "Weinbeeren" ist auch, und das soll es nicht weil es ja ein anderes Wort als "wein" ist. Wie kriege ich das noch hin?
    schon mal vielen dank



  • TheJoker schrieb:

    okay ich habe das Problem gelöst und zwar ähnlich wie opooioi.

    Falls dies der Fall sein sollte, hoffe ich, dass deine Lösung auch die Geschichte
    mit dem vector beinhaltet.
    Dann brauchst du nur folgendes zu ändern:

    for (StrVec::iterator it = vec.begin(); it != vec.end(); ++it)
    {
        // Stringvergleich
        if(*it == "English")
        {
            std::cout << "English" << std::endl;
            finish = true;
    
    [...]
    }
    

    ich hoffe, ich hab nix uebersehen, aber wenn im Vector die Wörter einzeln aufgelistet sind, wird es so gehen.



  • ja, ich habe das genauso mit dem vector gemacht wie opooioi.
    ich habe das jezt so probiert wie BasicMan01 das gemacht hat aber
    irgetwie kriege ich es nicht zum laufen.
    auf "EnglishGerman" wird immernoch reagiert, obwohl es nicht definiert ist. Definiert ist nur "German" und "English" aber nicht "EnglishGerman".



  • okay, ich war wohl doch einfach nur blind.
    ich habs geschaft. vielen dank an BasicMan01, opooioi und an alle anderen.
    Alles funktioniert jezt so wie es sollte.
    einen schönen Abend noch 🙂


Anmelden zum Antworten