c++ string initialisieren


  • Mod

    cimbomgs schrieb:

    Arcoth schrieb:

    Hier, Escape-Sequenzen:

    string str = "\x11\x0C\x35"; // und so weiter
    

    so klapp das nicht, mein string nimmt nur 3 Zeichen auf weil nach dem 3. Zeicehn \x00 kommt.

    string str = "\x11\x0C\x35\x00\x00\x00\x01";
    
    cout << str.size()
    

    size=3 !!

    Ohne C++11-Unterstützung kannst du auch die klassische C++98-Iterator-Variante wählen. Etwas umständlich, aber geht auch:

    const char initializer[] = "\x11\x0C\x35\x00\x00\x00\x01";
    string str(initializer, initializer + sizeof(initializer) / sizeof(*initializer));
    

    Das fügt natürlich noch ein Nullzeichen am Ende ein, das eventuell nicht erwünscht ist. Alternativen:

    string str(initializer, initializer + (sizeof(initializer) / sizeof(*initializer) - 1)); // Und sicher sein, dass initializer nicht leer ist!
    

    oder

    const char initializer[] = {\x11, \x0C, \x35, \x00, \x00, \x00, \x01};
    

  • Mod

    Etwas umständlich

    Und völlig überflüssig.

    cimbomgs schrieb:

    so klapp das nicht, mein string nimmt nur 3 Zeichen auf weil nach dem 3. Zeicehn \x00 kommt.

    Das lässt sich sehr leicht beheben.

    string str("\x11\x0C\x35\x00\x00\x00\x01", 7);
    

    Und natürlich ist die Größe 7.


  • Mod

    Arcoth schrieb:

    Etwas umständlich

    Und völlig überflüssig.

    So? Dann änder doch mal die Zahl der Zeichen bei deinem Vorschlag. Oder gib einen etwas längeren Text an. Auf einmal ist dein neuer Vorschlag nicht nur fast genau so umständlich sondern auch noch total fehleranfällig. Und das ist schlechter als nur umständlich zu sein.


  • Mod

    Dann änder doch mal die Zahl der Zeichen bei deinem Vorschlag.

    Das stimmt, das ist ein gravierender Nachteil. Besser, aber mehr Code:

    char const arr[] = "\x11\x0C\x35\x00\x00\x00\x01";
    string str(arr, sizeof(arr));
    

    Irgendwie wird das immer ein Zweizeiler.



  • char arr[] = "\x11\x0C\x35\x00\x00\x00\x01";
    

    Ich vermisse ein const .


  • Mod

    Arcoth schrieb:

    char const arr[] = "\x11\x0C\x35\x00\x00\x00\x01";
    string str(arr, sizeof(arr));
    

    Ja, das ist schon besser und besser als viele anderen C++98-Lösungen. An diesen Konstruktor hatte ich gar nicht gedacht (vermutlich, weil vector<char> so etwas nicht kann 🙂 ).



  • Ich hab mir vor langer langer Zeit mal Makros MY_ARRAY_BEGIN(a) und MY_ARRAY_END(a) gemacht die man hier schön verwenden könnte.

    std::string str(MY_ARRAY_BEGIN(arr), MY_ARRAY_END(arr));
    

    Das geht dann auch mit std::vector . Und auch mit wchar_t (bzw. allgemein beliebigen Typen).

    (Und die heissen natürlich nicht wirklich "MY_xxx" - statt "MY" steht da der Name unserer "das kann man überall brauchen" Library.)



  • hustbaer schrieb:

    (Und die heissen natürlich nicht wirklich "MY_xxx" - statt "MY" steht da der Name unserer "das kann man überall brauchen" Library.)

    Also bei mir heißen die MY_ und alles andere ist auch im namespace my.
    Finde ich persönlich jetzt sehr kreativ.



  • Wenn du das Zeug "MY" nennst, dann kannst du den Prefix/Namespace auch gleich weglassen, nen?



  • hustbaer schrieb:

    Wenn du das Zeug "MY" nennst, dann kannst du den Prefix/Namespace auch gleich weglassen, nen?

    Dat Makros.



  • Hä?
    Ich meine "my" ist ein verdammt schlechter Namespace-Name bzw. auch ein verdammt schlechter Prefix für Makros.
    Weil du vermutlich nicht der einzige bist der auf die Idee kommt "my" zu verwenden. Weil's halt nicht so doll einzigartig ist.

    => Sinnlos

    Aber das driftet schon wieder ziemlich weit OT...


  • Mod

    Wieso überhaupt ein Makro?



  • hustbaer schrieb:

    Hä?
    Ich meine "my" ist ein verdammt schlechter Namespace-Name bzw. auch ein verdammt schlechter Prefix für Makros.
    Weil du vermutlich nicht der einzige bist der auf die Idee kommt "my" zu verwenden. Weil's halt nicht so doll einzigartig ist.

    => Sinnlos

    Aber das driftet schon wieder ziemlich weit OT...

    Ich benutze das Prefix MY_ für Makros und alles andere ist im Namespace my.
    Leute, die ihre Bibliotheken my nennen, werden sie wohl kaum veröffentlichen, also krieg ich von da keine Konflikte.
    Und um etwas gegen das OT zu tun:
    Deine Array-Begin/End-Makros: Kein C++11 Support?



  • @Arcoth
    Ein Makro, weil nicht-Makro Lösungen alle diverse Probleme haben.
    Mir hängt da ein verschwommener Informationsfetzen im Hinterkopf rum - ich meine man kann Templates nicht auf Dinge mit "no linkage" spezialisieren. Also sowas:

    typedef struct /* here be dragons, but no name */
    {
       int foo;
    } FOO;
    
    FOO g_array[123];
    
    ...
    
        MY_ARRAY_BEGIN(g_array), MY_ARRAY_END(g_array)
    

    Und das geht dann nicht mit Template-Funktionen. Mit Makros geht es.

    @Nathan
    Richtig, kein C++11 Support.
    Im Beitrag von SeppJ, auf den ich geantwortet habe, war ja auch die Rede von "C++98-Lösungen".
    Und was das "my" angeht - ja, das geht so lange gut, bis du doch mal Code mit irgendjemandem Teilst der selbst auch das "my" Prefix verwendet. Also entweder du gibst ihm Code oder er dir oder ihr macht was zusammen - was auch immer. Und wie gesagt: wozu dann überhaupt irgend ein Prefix?


  • Mod

    ich meine man kann Templates nicht auf Dinge mit "no linkage" spezialisieren.

    Wie meinst du das?

    Und das geht dann nicht mit Template-Funktionen.

    typedef struct
    {
       int foo;
    } FOO;
    
    FOO g_array[123];
    
    int main()
    {
    	std::begin(g_array);
    }
    

    kompiliert.

    Ein Makro, weil nicht-Makro Lösungen alle diverse Probleme haben.

    Diverse? Was denn für welche?


Anmelden zum Antworten