vector<string> mit Werten zwischen 0 - 255 in char array speichern



  • Hallo,

    ich habe einen vector vom Typ std::string die Strings sind alles Zahlen zwischen 0 und 255 jetzt möchte ich den gesamten string in einem char array speichern, so ungefähr:

    vector<string>daten;
    char *c = new char[daten.size()];
    std::transform(daten.begin(),daten.end(),c,umwandeln);
    

    Meine Frage ist wie kann std::string zu char wandeln ?



  • std::string versteht die Methode c_str(). c_str() gibt dir einen char* zurück. Also einen Pointer auf einen nativen char Array.Die 2. Zeile bei dir ist aber falsch, weil du gar nicht weißt, wie lang jeder einzelne string ist. Du musst erst mal durch deinen Vektor iterieren und die Länge aller strings aufsummieren. Danach kannste erst allozieren und dann die Inhalte kopieren.



  • Ein String entspricht einem char -Array, keinem einzelnen char . Folglich würde ein Container aus Strings einem Array aus char -Arrays entsprechen.

    Wie möchtest du die Strings also speichern? Alle aneinandergehängt, oder für jeden ein eigenes Array? Und vielleicht noch viel wichtiger: Wieso brauchst du überhaupt die Umwandlung in char -Arrays, was stört dich am Container?



  • using namespace std;
    	vector<string> v;
    	v.push_back("1");
    	v.push_back("2");
    	v.push_back("3");
    
    	vector<char> c1(v.size());
    
            // using cstdlib atoi
    	struct tochar{
    		char operator ()(std::string& s){
    			return atoi(s.c_str());
    		}
    	};
    
            // using streams
    	struct tochar2{
    		char operator ()(std::string& s){
    			istringstream ss(s);
    			short c;
    			if (!(ss >> c))
    				throw "bad cast";
    			return static_cast<char>(c);
    		}
    	};
    	transform(v.begin(),v.end(),c1.begin(),tochar());
    
    	vector<char> c2;
    	transform(v.begin(), v.end(), back_inserter(c2), tochar2());
    


  • Danke genau sowas habe ich gesucht 🙂



  • Ich gehe mal davon aus, dass er z.B. ein String array {"237", "123", "53"} hat und daraus ein (unsigned) char array {237, 123, 53} machen will.

    Für das Umwandeln könntest du boost::lexical_cast verwenden. Also:

    #include <boost/lexical_cast.hpp>
    ..
    vector<string> daten;
    unsigned char *c = new unsigned char[daten.size()];
    std::transform(daten.begin(),daten.end(),c, boost::lexical_cast<int,std::string>);
    


  • Möglicherweise hilft dir auch die Klasse, die ich vor einiger Zeit für ein anderes Problem geschrieben habe:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-255092-and-start-is-10.html



  • Danke für die Hinweise, ich werde mir die unterschiedlichen Lösungen einmal angucken.



  • Man kann übrigens überall wo man ein array benötigt einen vector benutzen, da dieser die entsprechende Garantie bietet die Elemente in einem zusammenhängenden Speicherbereich zu halten.

    void f(char *);
    
    vector<char> v;
    copy(vonirgendwo-nach_v);
    f(&v[0]);
    

Anmelden zum Antworten