Überprüfung, ob Wort in einem Satz vorkommt



  • Hallo!

    Ich habe mir eine kleine Funktion geschrieben bzw. mit viel Hilfe zusammengebastelt, trotzdem, bin ich stolz, da das mein erster (für mich) etwas anspruchsvoller Code war. Ganz am Anfang hat der Code nichts anderes gemacht, als alle Wörter aus einem String in einen Vektor zu lesen und dann jedes Element nach dem mit übergebenen Schlüsselbegriff zu durchsuchen. Das hat auch funktioniert. Das einzige Problem war: Wenn ein Wort ein Satzzeichen hintendran hat (Wie geht es dir?) so wie das "dir?" im Beispielsatz, wird es von der Funktion nicht erkannt. Doof sowas. Also habe ich probiert, eine kleine Erweiterung des Codes zu basteln, die dann noch bei jedem Wort überprüft, ob ein Satzzeichen drin vorkommt. Das ganze sieht jetzt so aus:

    int InSentence(string sentence, string querry)
    {
    	int returnit = 0;
    	string param0002[] = {"!" , "." , "," , "-" , "_" , ":" , ";","?"};
    	int till = 1;
    	int set = 0;
    	size_t found;
    	istringstream istr(sentence);
    	vector<string> words;
    	string templower;
    	string line;
    	while((istr >> line)) words.push_back(line);
    	for(vector<int>::size_type i = 0; i < words.size(); i++)
    	{
    		templower = UpToLow(words[i]);
    		while(till==1)
    		{ 
    			for(int ii=0; ii<8; ii++)
    			{
    				found=templower.find(param0002[ii]);
     				if (found!=string::npos)
     				{
     					till = 1;
     					set = 1;
    					templower.replace(templower.find(param0002[ii]),param0002[ii].length(),"");
     				} else {
     					if(set!=1) { till = 0; }
     				}
    			}
    			set = 0;
    		}
    		if(templower == querry) returnit = 1;
    	}
    	if(returnit == 1) { return 1; }
    	return 0;
    }
    

    Schön und gut, die Funktion funktioniert (tolles Wortspiel oder? :D) auch, nur halt genauso wie vorher... Das heißt Wörter werden erkannt, Satzzeichen aber immer noch nicht... Hat einer eine Idee, woran das liegen könnte? Danke schonmal im Voraus 🙂
    Gruß,

    Jonathan

    P.S.: Die Funktion UpToLow funktioniert auch ohne Probleme und wandelt einfach nur den String ins kleingeschriebene um.



  • Zuerst Satzzeichen löschen, in vector schieben und durchsuchen. Fertig.

    bool in_text (std::string text, std::string word)
    {
    	std::string without = "!.,-_:;?";
    
    	//Satzzeichen löschen
    	std::string::iterator iter = without.begin();
    	for(;iter != without.end();++iter)
    	{	
    		std::string::iterator it = text.begin();
    		while (it != text.end ())
    		{
    			if(*it == *iter)
    				it = text.erase(it);
    			else
    				++it;
    		}
    	}
    
    	std::vector<std::string> v;
    
    	std::stringstream s (text);
    
    	//vector füllen
    	std::string w;
    	while (s >> w)
    	{
    		v.push_back( w );
    	}
    
    	//vector durchsuchen
    	std::vector<std::string>::iterator it = std::find (v.begin(),v.end(), word);
    
    	if(it != v.end())
    		return true;
    	else 
    		return false;
    }
    

    So schwer ist das doch nicht, oder?



  • Hm ich habe aber jetzt immernoch das selbe Problem wie vorhin... Wörter mit Satzzeichen werden nicht erkannt, wörter ohne schon...



  • Mefisto schrieb:

    Hm ich habe aber jetzt immernoch das selbe Problem wie vorhin... Wörter mit Satzzeichen werden nicht erkannt, wörter ohne schon...

    Nein. Für etwas filtere ich die da ja aus.



  • Ah, ich habe vergessen die konvertierung in Lower-Case wieder einzubauen... Deswegen hats gehackt... Vielen Dank, jetzt läufts 🙂


Anmelden zum Antworten