Effektiv Strings zählen



  • Hi,
    mit folgender Funktion möchte ich zählen, wie oft der String "bytes" im String "text" vorkommt. Leider funktioniert die Funktion nicht richtig, zum anderen dürfte es gerade in Punkto Geschwindigkeit viel zu optimieren geben.

    uint strcount(const string &text, const string &bytes) {
        uint c = 0, pos = 0;
    
        for (uint i = 0 ; i < text.length() ; i += bytes.length() ) {
            pos = text.substr( i,text.length() ).find( bytes );
            if (pos < text.length()) { ++c; } 
                else { return c; }
        }
    
        return c;
    }
    

    Zum Beispiel kann man die Variable Pos völlig wegrationalisieren, die Funktion blieb dadurch aber bei mir trotzdem fehlerhaft.

    Danke,
    Neo



  • Is klar, dass die nicht richtig funktioniert. Guck mal folgenden Fall:

    text = "afoo";
    bytes = "foo";
    

    Deine Funktino testet nur, ob alle drei Zeichen ein foo steht.

    Schau dir mal string::find() an.



  • Wenn du die Wörter einfach nur zählen willst würde das vielleicht reichen:

    int begin=0,end=0,vorhanden=0;
    	while((begin=text.find(word,end))!=string::npos)
    	{
    		end = begin+1;
    		vorhanden++;
    
    	}
    


  • @Michael: Ich verstehe nicht ganz, was du meinst. Wird ein foo gefunden wird gezählt und die Position so erhöht, dass dieses eben gezählte foo nicht mehr zählbar ist. Tritt ab hier jetzt kein foo mehr auf wird die Schleife verlassen.
    Zumindest *sollte* es so funktionieren.

    @Auflage 5:
    Was gibt der zweite Prameter der string.find() Funktion an?
    Und was ist string::npos?

    Thanks 🙂



  • NeoInferno schrieb:

    Was gibt der zweite Prameter der string.find() Funktion an?

    Wo er mit der Suche beginnen soll...

    NeoInferno schrieb:

    Und was ist string::npos?

    Eine ungültige Stringposition. find gibt z.B. npos zurück wenn es nichts mehr finden kann.



  • Der zweite Paramter von der string memberfunktion find gibt an, ab welcher Stelle im String gesucht werden soll. Wenn find erfolgreich war wird die Position an der der String gefunden wurde zurückgeben, wenn das Wort nicht im String gefunden wird gibt find string::npos zurück. npos ist ein Wert der sozusagen ausdrückt das dass entsprechende Wort nicht im String gefunden wurde.



  • Ok, danke, hab meinen Algo inzwischen mit dem zweiten find Parameter und string::npos fehlerfrei zum Laufen bekommen 🙂



  • NeoInferno schrieb:

    @Michael: Ich verstehe nicht ganz, was du meinst.

    Gegeben folgendes Beispiel:

    text = "bla blubb"
    bytes = "la"
    bytes.length() = 2
    

    Du guckst (mit deiner ursprünglichen Funktion) nur alle byte.length() Zeichen, ob dort bytes anfängt. Also in diesem Beispiel so:

    [b]bl[/b]a blubb
    bl[b]a [/b]blubb
    bla [b]bl[/b]ubb
    bla bl[b]ub[/b]b
    bla blub[b]b[/b]
    

    Kein einziges Mal ist das fett markierte = la, la kommt dennoch vor.


Anmelden zum Antworten