std::string und char*



  • Frage15 schrieb:

    Ah danke @unskilled, so funktionierts, ich Depp hatte die Parameter auch extra in Anführungsstrichen.

    kaum macht mans richtig - schon funktionierst ^^
    auch, wenn sich das (die doku, also die msdn) in meinen augen ein wenig wiederspricht 😉

    bb



  • Frage15 schrieb:

    CreateProcess() hat LPSTR als zweiten Parameter. Ich möchte mit std::string arbeiten, das geht hier aber wohl nicht?

    Dies dürfte ungültig sein, da std::string nicht terminiert:

    std::string string = "bla.exe -test 1 2 3"
    CreateProcess("bla.exe", &string[0], ...)
    

    Doch, das geht so! std::string hat immer eine terminierende '\0' hinten und eine zweite brauchst du nicht.



  • Badestrand schrieb:

    Frage15 schrieb:

    CreateProcess() hat LPSTR als zweiten Parameter. Ich möchte mit std::string arbeiten, das geht hier aber wohl nicht?

    Dies dürfte ungültig sein, da std::string nicht terminiert:

    std::string string = "bla.exe -test 1 2 3"
    CreateProcess("bla.exe", &string[0], ...)
    

    Doch, das geht so! std::string hat immer eine terminierende '\0' hinten und eine zweite brauchst du nicht.

    Ne, das ist absolut undefiniert.



  • Tachyon schrieb:

    Ne, das ist absolut undefiniert.

    Selbst wenn, dieses Verhalten findest du in allen Implementationen, die du unter Windows nutzen kannst. Geht ja ohne große Frickelei auch nicht anders, da c_str() einen const char* mit '\0' hinten herausgibt, dabei den string aber nicht ändern darf (weil const).



  • Badestrand schrieb:

    Selbst wenn, dieses Verhalten findest du in allen Implementationen, die du unter Windows nutzen kannst.

    Ist das so? Ich denke nicht. Und selbst wenn, wer sagt Dir, dass <benutzte Implementierung einsetzen> das nicht beim nächsten Release ändert? Und dann wundert man sich über bizarre Fehler.
    Ich würde in solchen Fällen immer auf Draveres Vorschlag zurückgreifen. Damit ist man auf der sicheren Seite, und so kompliziert isses auch nicht.

    Badestrand schrieb:

    Geht ja ohne große Frickelei auch nicht anders, da c_str() einen const char* mit '\0' hinten herausgibt, dabei den string aber nicht ändern darf (weil const).

    Ja, das ist auch gut so. Der von c_str() zurückgegebene Buffer muss nichts mit dem im String verwalteten Buffer zu tu haben.



  • Badestrand schrieb:

    ...Geht ja ohne große Frickelei auch nicht anders, da c_str() einen const char* mit '\0' hinten herausgibt, dabei den string aber nicht ändern darf (weil const).

    😕
    Was soll daran Frickelei sein? Einfach eine Kopie und fertig.

    Gruß,

    Simon2.



  • Tachyon schrieb:

    Ist das so? Ich denke nicht.

    Zumindest VS03-08, die GCC-C++-Bib und StlPort handhaben das so, warum auch sollte für char& operator[](int pos) und c_str() ein anderer Buffer angegeben werden. Es geht eben nicht sinnvoll anders. Oder zeig mir wie, dann bin ich ruhig 🙂

    Simon2 schrieb:

    Was soll daran Frickelei sein? Einfach eine Kopie und fertig.

    return strdup(m_buf) ? Zeig mal, was du meinst.



  • Badestrand schrieb:

    ...

    Simon2 schrieb:

    Was soll daran Frickelei sein? Einfach eine Kopie und fertig.

    return strdup(m_buf) ? Zeig mal, was du meinst.

    Mal nur als Skizze:

    class string {
       char* extBuf;
       char* intBuf;
       size_t len;
    public:
       char const* c_str() { 
          if(changed) {
             extBuf = new char[len+1];
             copy(intBuf, intBuf+len, extBuf);
             extBuf[len] = '\0';
          }
          return extBuf;
       }
    };
    

    Soweit ich recht weiß, gibt der Standard keine Zusage über die "Gültigkeitsdauer" des CStrings, der sich hinter dem Rückgabewert von c_str() verbirgt.

    Natürlich kann man da noch viel mit caching, reference counting, internen Arrays,.... optimieren - hier geht es nur um eine Skizze.

    Gruß,

    Simon2.



  • Badestrand schrieb:

    return strdup(m_buf) ? Zeig mal, was du meinst.

    std::string bla("Besser kopieren als probieren!");
    std::vector<std::string::value_type> buffer(bla.begin(), bla.end());
    buffer.push_back('\0');
    crazy_nonconst_evil_operations(&buffer[0]);
    


  • Simon2 schrieb:

    Mal nur als Skizze:

    Dann mach das mal, während c_str() const ist.


Anmelden zum Antworten