std::string in char-array wandeln



  • 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