String nach String durchsuchen



  • Hallo,

    Ich habe einen ziemlich langen string, den ich nach einer bestimmten Zeichenfolge durchsuchen möchte, was ich mit der für mich idealsten Lösung find() mache. Nur soll die Gesamte Zeichenkette, auch wenn die gesuchte Folge gefunden wurde, weiter durchsucht werden, bis an ihr Ende, weil die gesuchte Zeichenfolge mehrmals im string auftauchen kann. Alle Positionen will ich in einem Array abspeichern.

    Mein aktueller Code:

    int Found[255];
    int a = 0;
    string Zeile, Inhalt;
    unsigned int Pos = 0;
    
    while( Pos < Zeile.length() )
    {
       Pos = Zeile.find( Suche, Pos );
       if( string::npos != Pos )
       {
           Found[a] = Pos;
           a++;
       }
    }
    

    Ich bekomme aber, wenn ich es ausführe immer eine Fehlermeldung und das Programm muss sich beenden. Weiß jemand eine Lösung?



  • Fragenmann schrieb:

    Hallo,

    Ich habe einen ziemlich langen string, den ich nach einer bestimmten Zeichenfolge durchsuchen möchte, was ich mit der für mich idealsten Lösung find() mache. Nur soll die Gesamte Zeichenkette, auch wenn die gesuchte Folge gefunden wurde, weiter durchsucht werden, bis an ihr Ende, weil die gesuchte Zeichenfolge mehrmals im string auftauchen kann. Alle Positionen will ich in einem Array abspeichern.

    Mein aktueller Code:

    int Found[255];
    int a = 0;
    string Zeile, Inhalt;
    unsigned int Pos = 0;
    
    while( Pos < Zeile.length() )
    {
       Pos = Zeile.find( Suche, Pos );
       if( string::npos != Pos )
       {
           Found[a] = Pos;
           a++;
       }
    }
    

    Ich bekomme aber, wenn ich es ausführe immer eine Fehlermeldung und das Programm muss sich beenden. Weiß jemand eine Lösung?

    Vermutlich findest du mehr als 255 Mal etwas. Dein Array kann aber nur 255 Elemente aufnehmen. Dein Programm stürzt dann ab. Du kannst das Problem mit std::vector, std::list oder std::stack, usw. lösen. Was davon für dich am besten geeignet ist, hängt davon ab, was du genau vor hast.



  • #include <iostream>
    #include <string>
    #include <vector>
    
    int main()
    {
    	std::string zeile("ein teststring ein string ein test");
    	std::string suche("ein");
    	std::vector<std::string::size_type> positionen; // lieber ein std::vector als ein Array
    	std::string::size_type cur_pos = zeile.find(suche); // erstes Auftreten finden
    	while(cur_pos != std::string::npos) { // falls etwas gefunden wurde -> weitersuchen
    		positionen.push_back(cur_pos);
    		cur_pos = zeile.find(suche, ++cur_pos); // ++cur_pos um ab der nächsten Position zu suchen
    	}
    
    	std::cout << "Suchstring \"" << suche << "\" wurde in\n\""
    			  << zeile << "\"\nan den folgenden Positionen gefunden:" << std::endl;
    	for(std::vector<std::string::size_type>::const_iterator beg(positionen.begin()), end(positionen.end()); beg != end; ++beg)
    		std::cout << "Position -> " << *beg << "\n";
    
    	return 0;
    }
    


  • Mizar schrieb:

    #include <iostream>
    #include <string>
    #include <vector>
    
    int main()
    {
    	std::string zeile("ein teststring ein string ein test");
    	std::string suche("ein");
    	std::vector<std::string::size_type> positionen; // lieber ein std::vector als ein Array
    	std::string::size_type cur_pos = zeile.find(suche); // erstes Auftreten finden
    	while(cur_pos != std::string::npos) { // falls etwas gefunden wurde -> weitersuchen
    		positionen.push_back(cur_pos);
    		cur_pos = zeile.find(suche, ++cur_pos); // ++cur_pos um ab der nächsten Position zu suchen
    	}
    
    	std::cout << "Suchstring \"" << suche << "\" wurde in\n\""
    			  << zeile << "\"\nan den folgenden Positionen gefunden:" << std::endl;
    	for(std::vector<std::string::size_type>::const_iterator beg(positionen.begin()), end(positionen.end()); beg != end; ++beg)
    		std::cout << "Position -> " << *beg << "\n";
    
    	return 0;
    }
    

    Ich denke, es reicht wenn man den Iterator so initialisiert:

    std::vector<std::string::size_type>::const_iterator beg = positionen.begin()
    


  • Danke an alle, es geht jetzt.



  • Sowas hier:

    for(std::vector<std::string::size_type>::const_iterator beg(positionen.begin()), end(positionen.end()); beg != end; ++beg)
    

    ist bei mir schon zur Gewohnheit geworden. Dein Vorschlag:

    BBBB schrieb:

    std::vector<std::string::size_type>::const_iterator beg = positionen.begin()
    

    geht natürlich auch :).


Anmelden zum Antworten