split



  • hallo zusammen.

    ich habe mir mal eine split funktion geschrieben, damit ich das thema mal verstehe.

    nun habe ich aber ein problem.

    wenn ich splitten möchte und dann folgendes habe:

    Split("test\t", "\t", 0);
    
    vector<string> Split(string data, string delimeter, int count) {
    
    	if(!count) {
    
    		count = StrCnt(data, delimeter);
    
    	}
    
    	vector<string> arg;
    
    	for(int i = 0, pos = 0; i <= count; i++) {
    		pos = data.find(delimeter);
    		arg.push_back(data.substr(0, pos));
    		data = data.substr(pos+delimeter.length(), data.length());
    
    	}
    
    	return arg;
    
    }
    
    int StrCnt(string data, string search) {
    
    	int count = 0, pos;
    
    	for(int i = 0; !i;) {
    
    		pos = data.find(search);
    
    		if(pos >= 0) {
    
    				count++;
    				data = data.substr(pos+search.length(), data.length());
    
    		}
    		else {
    
    				i++;
    
    		}
    	}
    
    	return count;
    
    }
    

    bekomme ich eine Fehlermeldung und in der schleife, in der die sachen gesplittet werden, wird abgebrochen.

    wie kann ich das beheben?

    also am ende steht ja ein tabulator-steuerzeichen, nach dem ich trennen möchte.
    dann sollte es aber so sein, dass ebenfalls wieder 2 einträge im vector herauskommen:

    • "test"
    • ""

    also das zeichen, nach dem getrennt wurde fällt ja weg und danach noch einen leeren string zurückgeben.

    gruß anno



  • Und die Fehlermeldung lautet?



  • ok, man muss nach "\\t" splitten.

    dann kommt die meldung:

    "exception der klasse std::out_of_range"



  • vector<string> Split(string data, string delimeter, int count) {

    Da ist noch ein Schreibfehler: Es sollte vermutlich delhimeter heissen.
    Das sind nämlich die Meter in Indien...
    Simon



  • Zum eigentlichen Problem:
    Das lässt sich ganz bestimmt schnell lösen, wenn Du den Debugger benutzt.
    Simon



  • ja habe ich schon, allerdings kapiere ich nicht, warum im 2. durchlauf der schleife ein -1 als wert herauskommt bei der pos variable.



  • Dann lies mal bei der Doku von std::string::find(..) nach.
    Ich erspare dir mal das suchen:
    http://www.cplusplus.com/reference/string/string/find.html
    Simon



  • na ich weiß jetzt nicht genau, aber das könnte eine lösung sein:

    for(int i = 0, pos = 0; i <= count; i++)
    		{
    				pos = data.find(delimeter);
    				if(pos < 0) {
    
    					arg.push_back("");
    
    				}
    				else {
    					arg.push_back(data.substr(0, pos));
    					data = data.substr(pos+delimeter.length(), data.length());
    				}
    		}
    

    oder was meint ihr dazu?



  • ne, geht leider auch nicht.



  • nee, echt?



  • simon.gysi schrieb:

    nee, echt?

    ja dann nenn mir mal deine lösung, bitte.

    ich komme icht drauf.



  • 2 Funktionen und du kannst jetzt selbst rausfinden, was anderst ist und wie sie funktionierne.

    std::vector<std::string> split (std::string data, char del)
    {
    	std::replace (data.begin(),data.end(),del,' ');
    	std::stringstream s (data);
    	std::string word;
    	std::vector<std::string> v;
    	while(s >> word)
    		v.push_back (word);
    	return v;
    }
    
    std::vector<std::string> split2 (std::string data, char del)
    {
    	std::vector<std::string> v;
    	std::string::iterator it = std::find (data.begin (), data.end (), del);
    	std::string::iterator last = data.begin ();
    	while(it != data.end ())
    	{
    		std::string name = std::string (last,it);
    		v.push_back (name);
    		last = ++it;
    		it = std::find (it, data.end(), del);
    	}
    	return v;
    }
    

Anmelden zum Antworten