c++ string initialisieren



  • Nathan schrieb:

    Es gibt einen string-Konstruktor, der eine Ansammlung von Zahlen/Zeichen haben will.
    Den musst du aber mit geschweiften Klammern aufrufen und ist auch nur verfügbar, wenn du C++11 hast.
    Ansonsten musst du ein char-Array manuell erstellen und das übergeben.

    Nathan, danke für die schnelle Antwort.

    1. wäre das so richitg?:

    string str = {0x11, 0x0C, 0x35, 0x00, 0x00, 0x00,0x01};
    

    2. wo kann ich gucken ob ich C++11 habe? Ich verwende VS 2010.

    Danke


  • Mod

    cimbomgs schrieb:

    kann mir jemand erklären warum ich ein string nicht so initialisieren kann:

    string str(0x11, 0x0C, 0x35, 0x00, 0x00, 0x00,0x01);
    

    Wenn ich nun schreibe

    string str(0x11, 0x0C);
    

    Will ich dann einen String mit den Zeichen 0x11 und 0x0C oder will ich 0x11 Mal das Zeichen 0x0C?



  • SeppJ schrieb:

    cimbomgs schrieb:

    kann mir jemand erklären warum ich ein string nicht so initialisieren kann:

    string str(0x11, 0x0C, 0x35, 0x00, 0x00, 0x00,0x01);
    

    Wenn ich nun schreibe

    string str(0x11, 0x0C);
    

    Will ich dann einen String mit den Zeichen 0x11 und 0x0C oder will ich 0x11 Mal das Zeichen 0x0C?

    ich will die Zeichen 0x11 und 0x0C


  • Mod

    cimbomgs schrieb:

    1. wäre das so richitg?:

    string str = {0x11, 0x0C, 0x35, 0x00, 0x00, 0x00,0x01};
    

    Ja.

    2. wo kann ich gucken ob ich C++11 habe? Ich verwende VS 2010.

    Das kannst du da dran sehen, ob obiges funktioniert 🙂 .

    Etwas genauer:
    http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport

    MSVC 10.0 kennt also noch keine initializer lists.

    cimbomgs schrieb:

    ich will die Zeichen 0x11 und 0x0C

    Ja, das weiß ich auch. Die Frage ist, wie das aus der von dir vorgeschlagenen Schreibweise hervorgehen soll? Schließlich gibt es schon einen Konstruktor, der zwei Zahlen nimmt.



  • 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 !!



  • danke euch allen 🙂

    es geht also nur wenn char-Array manuell erstellt wird und das an string übergeben wird.

    ich hatte gehofft dass es auch anders geht :D..


  • 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?


Anmelden zum Antworten