Teilstrings innerhalb eines String suchen



  • arbeite mit 2 Pointern und vergleiche solange (wenn Buchstabe gleich gewesen) bis dein Pointer für das Vergleichswort == '\0' und der für den String == ' ' || '\0' ist.

    werd dir noch über ein paar konzeptsachen klar.
    z.B. case sensitive? muss einzelnes wort sein oder reicht wenn in Wort enthalten? etc...



  • erstens:

    string s = {...}
    

    gibt es nicht, ausser du hast es mit

    typedef char string[1000];
    

    definiert...

    string gibt es soviel ich weiß (bin anfänger in c++) in C++, daher
    vermute ich du willst in C++ programmieren.

    was deine wörter vergleichen funktion können sollte, ist mit schleifen den
    array durchgehen (oder im falle von c++ den string durchgehen) und
    anfangsposition und endposition jedes wortes speichern, mit diesen start/end
    werten kannst du dann wort für wort vergleichen.

    gruß
    ITEDVO



  • In C++ gibt es string.find(), womit es sogar noch einfacher ist.



  • Mit schleifen könnte man das lösen, ja.

    Ich frage mich aber, wie ich das mit der Paramterübergabe machen kann.

    In manchen fällen werden ja nur 2 paramter übergeben, in anderen 12.
    Wobei das schema ja immer gleich ist:
    Der erste ist der zu prüfende String. Der rest die zu überprüfenden.



  • Übergib doch einfach einen String, der alle Parameter enthält und zerlege diese dann innerhalb der Funktion. Somit braucht deine Funktion immer nur 2 Parameter.



  • In C gibt es die Möglichkeit der Übergabe einer variablen Anzahl Parameter. Diese kannst du verwenden.



  • Wutz meint stdarg.h womit du dies auch lösen kannst. Mach dich einfach mal schlau drüber.



  • Bei stdarg.h musst du aber bekannt geben wie viel Parameter du übergibst.
    Entweder NULL-Zeiger am Schluss oder extra Parameter.
    printf erfährt das aus dem Formatstring (Anzahl der 😵

    Schau mal bei das Beispiel bei http://www.cplusplus.com/reference/clibrary/cstdarg/va_start/ ist schon fast was du brauchst.



  • In C++ (mit Angabe der Parameteranzahl):

    #include <cstdarg>
    #include <string>
    #include <iostream>
    
    bool check(const std::string& str, int amount, ...)
    {
    	bool res = true;
    
    	va_list vl;
    	va_start(vl, amount);
    
    	for (int i = 0; i < amount; ++i)
    	{
    		if (str.find(va_arg(vl, char *)) == std::string::npos)
    		{
    			res = false;
    			break;
    		}
    	}
    
    	va_end(vl);
    
    	return res;
    }
    
    int main ()
    {
    	std::string s = "Der Schrein ohne Deckel, Schlüssel, Scharnier bringt einen goldenen Schatz, glaubt es mir";
    
    	if (check(s, 2, "Schrein", "Scharnier"))
    	{
    		std::cout << "true 1\n";
    	}
    
    	if (check(s, 4, "Schrein", "Scharnier", "Schatz", "Deckel"))
    	{
    		std::cout << "true 2\n";
    	}
    
    	if (check(s, 2, "Schatz", "Wolke"))
    	{
    		std::cout << "true 3\n";
    	} 
    
    	return 0;
    }
    


  • Und die Variante ohne Parameteranzahl:

    bool check(const std::string& str, const char *first, ...)
    {
    	bool res = true;
    
    	va_list vl;
    	va_start(vl, first);
    
    	while (first != NULL)
    	{
    		if (str.find(first) == std::string::npos)
    		{
    			res = false;
    			break;
    		}
    
    		first = va_arg(vl, const char *);
    	}
    
    	va_end(vl);
    
    	return res;
    }
    
    // Aufruf:
    if (check(s, "Schrein", "Scharnier", "Schatz", "Deckel", NULL))
    {
    }
    


  • Und wen interessiert dieses C++ Zeugs hier?



  • Wenn dir die va_ Variante zu kompliziert ist, kannst du natürlich auch die zu suchenden Wörter als String übergeben und den dann auch jeweils für die Suche zerlegen, also

    check(s, "Schrein,Scharnier,Schatz,Deckel");
    

Anmelden zum Antworten