split Funktion funktioniert nicht



  • #include <iostream>
    #include <string>
    
    void split(const std::string& str) {
        std::string::size_type oldidx = 0, newidx;
        while((newidx = str.find('|', oldidx)) != std::string::npos) {
          std::cout << str.substr(oldidx, newidx) << std::endl;
          oldidx = newidx + 1;
        }
    }
    
    int main()
    {
    	std::string s = "Test|egal|nichts";
    	split(s);
    }
    

    Hi. Das ist mein Versuch für eine Split-Funktion. Leider wird

    Test
    egal|nich

    ausgegeben. Was mach ich falsch??

    Kann man die noch verbessern oder ist sie total falsch? 😋



  • Das letzte Stück fehlt noch. Wenn newidx == string::npos, bricht zwar die Schleife ab, aber du mußt noch den Rest ausgeben.

    Ach ja, und es muß str.substr(oldidx, newidx**-oldidx**) heißen, da der zweite Parameter die Länge und die Endposition des Substrings angibt.



  • Ah vielen vielen Dank. Das mit dem substr war mein Hauptproblem. 🙂
    Ich komme von Java und da war die Methode so:

    substring(int beginIndex, int endIndex)

    Hatte nicht damit gerechnet das das in C++ anders gemacht wird. 😉

    Nochmal die korrigierte Variante, falls es jemand noch brauchen sollte.

    void split(const std::string& str) {
        std::string::size_type oldidx = 0, newidx;
        while((newidx = str.find('|', oldidx)) != std::string::npos) {
    		std::cout << str.substr(oldidx, newidx - oldidx) << std::endl;
    		oldidx = newidx + 1;
        }
        std::cout << str.substr(oldidx) << std::endl;
    }
    


  • Das Witzige ist, daß ich wenige Stunden vor deinem Post was erstaunlich Ähnliches geschrieben habe, allerdings schon daheim war und deshalb nicht direkt den Code posten konnte. 🙂

    vector<int> splitString(const string &to_split, char splitter)
    {
    	size_t beg = 0, end;
    	stringstream sstr;
    	int num;
    	vector<int> v;
    
    	while ((end = to_split.find(splitter, beg)) != string::npos)
    	{
    		sstr << to_split.substr(beg, end - beg);
    		sstr >> num;
    		sstr.clear();
    
    		v.push_back(num);
    		beg = end + 1;
    	}
    	sstr << to_split.substr(beg);
    	sstr >> num;
    	v.push_back(num);
    
    	return v;
    }
    

Anmelden zum Antworten