std::string in char-array wandeln



  • Ich hatte das mal so gemacht:

    template<class charT>
    class StringBuffer {
      public:  
        StringBuffer(std::basic_string<charT>& string, std::size_t size) :
          ref(string), buf(new charT[size + 1]), bufsize(size) 
        { }
        ~StringBuffer() {
            destroy();
        }
        operator charT*() {
            return buf;
        }
        operator const charT*() const {
            return buf;
        }
        std::size_t size() const {
            return bufsize;
        }
        void sync() {
            if(buf) ref = buf;
        }
        void destroy() {
            sync();
            delete [] buf;
            buf = 0;
            bufsize = 0;
        }
      private:
        std::basic_string<charT>& ref;
        charT* buf;
        std::size_t bufsize;
    };
    
    // z.b.
    std::string mystring = "huhu";
    winapi_func(StringBuffer<char>(mystring, 255));
    

    War grade so ausm Kopf, muss also nicht so compilieren. Wenn der String nicht größer wird kannste auch const_cast nehmen (bis dir das die Standardfanatiker wieder ausreden...)



  • Danke, aber geht das nicht (VIEL) einfacher? Möglichst wenig code bitte.



  • In NOTIFYICONDATA ist ein TCHAR-Array, d.h. wenn du ein ASCII Build machst hast du ein char Array bei einem Unicode-Build ein wchar_t Array.
    Wenn du dich nur auf Ascii beschränkst, dann kannst du direkt den std::string reinkopieren, sonst musst du vorher noch mit ToUnicode, oder einer der anderen Konvertierungsfunktionen den String umwandeln (MultiByteToWideChar z.B.)

    Wenn es nur ascii ist, dann mach es so:

    std::string der_str;
    char* der_buffer;
    
    std::memcpy( der_buffer, der_str.c_str(), der_str.size() );
    


  • FF?

    firefox.
    hatte mich in dem moment wieder mit seiner absolut verbuggten copy/paste funktion angebrochen, so dass ich den link editieren musste.



  • Nixkopf schrieb:

    Danke, aber geht das nicht (VIEL) einfacher? Möglichst wenig code bitte.

    Klar, geht es.

    NOTIFYICONDATA icondata;
    icondata.szTip = TEXT("Teststring");
    


  • Danke, aber...

    cannot convert from 'const char [23]' to 'CHAR [64]'
    

    MfG



  • Grr, daran hatte ich nicht gedacht. Dann eben doch 'copy'. Wo ist das Problem?

    string str = "Hallo, Welt";
    
    copy(str.begin(), str.end(), icondata.szTip);
    


  • Achso, ich dachte, das geht etwas mehr "rein C++".

    Danke!
    MfG



  • Nixkopf schrieb:

    Achso, ich dachte, das geht etwas mehr "rein C++".

    'copy' ist *absolut* "rein C++". Daher habe ich ja auch extra *nicht* 'strcpy' verwendet.



  • Oki, super.

    MfG



  • Aber wenn szTip ein CHAR[64], dann gib ihm auch nur 64 Zeichen:

    if (str.size () < 64)
        std::copy (str.begin (), str.end (), icondata.szTip);
    else
    {
        std::copy_n (str.begin (), 63, icondata.szTip);
        icondata.szTip[63] = '\0';
    }
    

    oder so ähnlich.



  • std::copy ist für sowas aber nicht gerade der effiziente Weg. Bei built-ins ist man mit einem std::mempcy besser dran.



  • Wird eh mit ner fixen Länge unter 64 beschrieben, daher unnötig.

    MfG


  • Mod

    lolz schrieb:

    std::copy ist für sowas aber nicht gerade der effiziente Weg. Bei built-ins ist man mit einem std::mempcy besser dran.

    Das hängt von vielen Faktoren - nicht zuletzt der Implementation von std::copy (die ohne weiteres memcpy benutzten kann) ab. Zudem ist die reine Laufzeitfrage - wenn du darauf abstellen willst - oft genug gar nicht das wesentliche Kriterium.



  • Nixkopf schrieb:

    Wird eh mit ner fixen Länge unter 64 beschrieben, daher unnötig.

    Sagte der Frosch und sprang in den Mixer ;).



  • camper schrieb:

    lolz schrieb:

    std::copy ist für sowas aber nicht gerade der effiziente Weg. Bei built-ins ist man mit einem std::mempcy besser dran.

    Das hängt von vielen Faktoren - nicht zuletzt der Implementation von std::copy (die ohne weiteres memcpy benutzten kann) ab. Zudem ist die reine Laufzeitfrage - wenn du darauf abstellen willst - oft genug gar nicht das wesentliche Kriterium.

    Mir ist das schon klar, aber man sollte andere darauf hinweisen.



  • Ich denke nicht, dass die Homepageadresse meiner Gemeinschaft jemals aus über 64 Zeichen bestehen wird, zumal sich der Name sowieso niemals ändern wird.

    MfG


  • Mod

    lolz schrieb:

    camper schrieb:

    lolz schrieb:

    std::copy ist für sowas aber nicht gerade der effiziente Weg. Bei built-ins ist man mit einem std::mempcy besser dran.

    Das hängt von vielen Faktoren - nicht zuletzt der Implementation von std::copy (die ohne weiteres memcpy benutzten kann) ab. Zudem ist die reine Laufzeitfrage - wenn du darauf abstellen willst - oft genug gar nicht das wesentliche Kriterium.

    Mir ist das schon klar, aber man sollte andere darauf hinweisen.

    worauf und warum?


Anmelden zum Antworten