string split (ohne boost)



  • Da wo der Kommentar 'Komma überlesen' in meinem Posting steht. Dort wird ein Zeichen mittels ss >> c; 'weggelesen'. Leerzeichen, Tabulatoren und sonstige Whitespace-Zeichen werden standardmäßig vom >> Operator sowieso überlesen, so dass wegen der Definition von c als char genau ein Zeichen gelesen, in c gespeichert und nicht weiter verwendet wird, aber aus dem Stream ist es damit raus, so dass es mit dem nächsten int weitergehen kann.



  • Das verstehe ich. 🙂
    Nun würde ich das ganze gerne aber doch als array machen, da das ganze Bestandteil einer Klasse werden soll. Gibt es Möglichkeiten, ein ganz normales Array ( int array[10]; ) auch dynamisch zu definieren ( int array[x]; )?

    Den Code habe ich mir dementsprechend umgebaut, nur beim initialisieren eines Arrays per Variable, die ja erst zur Laufzeit steht, gibts natürlich 'nen error...

    1>  main.cpp
    \codetest\main.cpp(29): error C2057: Konstanter Ausdruck erwartet
    \codetest\main.cpp(29): error C2466: Zuordnung eines Arrays der konstanten Größe 0 nicht möglich.
    \codetest\main.cpp(29): error C2133: 'intarray': Unbekannte Größe
    


  • thuering schrieb:

    Das verstehe ich. 🙂
    Nun würde ich das ganze gerne aber doch als array machen, da das ganze Bestandteil einer Klasse werden soll.

    Na und? Wieso kann nicht der Vektor Bestandteil der Klasse werden? Wenn Du ein rohes Array dynamisch halten willst, musst Du mit malloc selbst Speicher in der erforderlichen Größe dafür anfordern, UND später auch wieder freigeben. Du kannst Dir da - gerade mit relativ wenig Erfahrung - schnell Probleme mit Arraygrenzen und/oder Memoryleaks einhandeln.
    Solange nichts gegen Nutzung eines Vektors oder sonstigen STL-Containers spricht, solltest Du einen solchen benutzen.



  • string income = "hallo,hallo,hallo";
    vector<string> arguments;
    	string buffer;
    	stringstream incometest(income);
    	getline(incometest,buffer, ',' );
    	arguments.push_back(buffer);
    


  • In etwa so (ungetestet):

    std::vector<int> v;
    boost::spirit::qi::phrase_parse(begin, end, int_ % ',', boost::spirit::ascii::space, v);
    


  • 314159265358979 schrieb:

    In etwa so (ungetestet):

    std::vector<int> v;
    boost::spirit::qi::phrase_parse(begin, end, int_ % ',', boost::spirit::ascii::space, v);
    

    Lesen kann nicht jeder... 😉

    string split (ohne boost)



  • Ups. Wie peinlich.

    @TE: Gibt es eigentlich einen Grund, der gegen boost spricht? Wie du siehst ist das ziemlich elegant gelöst in Spirit.



  • Ich kenne boost überhaupt nicht, bzw. nur vom Hörensagen. Wie lange würde ich wohl benötigen, wenn ich mir das nun installieren würde, bis ich diese tolle, elegante Lösung gefunden hätte?



  • Nicht lange, Spirit ist Header-only 😉



  • Ob nun Boost oder nicht - dann mache ich das jetzt mit einem Vector.
    Allerdings habe ich dann wieder Fragen.

    {
        ifstream file(datei);
        getline(file, MonsterName);
        getline(file, MonsterRasse);
        getline(file, MonsterKlasse) >> MonsterTP >> MonsterAC >> MonsterTHAC0 >> MonsterWeapon >> MonsterIniMod >> MonsterMinAnzahl >> MonsterMaxAnzahl >> MonsterXP >> MonsterGroesse;
        getline(file, MonsterAngriffe);
    }
    
    stringstream ss(MonsterAngriffe);
    vector<int> vec_temp;
    int temp;
    
    while(ss >> temp)
    {
    	vec_temp.push_back(temp);
    	char c;
    	ss >> c;
    }
    
    //GegnerV ist auch ein Vector, welche Objekte der Klasse Enemy beinhalten kann
    //Also Vector in Vector - geht das?
    GegnerV.push_back(Enemy(MonsterName,MonsterRasse,MonsterKlasse,MonsterTP,MonsterAC,MonsterTHAC0,MonsterWeapon,MonsterIniMod,MonsterXP,MonsterGroesse,vec_temp));
    

    Die erste Frage ist nun, ob der Konstruktoraufruf in der untersten Zeile so funktioniert (man beachte "vec_temp") - was verlangt ein vector<int> in einem Konstruktur der darüberstehenden Klasse als Eingabe?

    EDIT: "Enemy" ist eine Klasse.
    nochmal der Inhalt der ausgelesenen Datei:

    Gruener Drache (Nestling)
    Gruener Drache
    Gruener Drache
    36
    3
    7
    13
    3
    1
    1
    1400
    4
    100, 100, 101, 201
    

    EDIT 2: In der Klasse Enemy ist der (auch über den Konstruktor der Klasse aufrufbare) Vector so deklariert:

    vector<int> attacks;
    

Anmelden zum Antworten