c++ string initialisieren
-
Hallo Forum,
kann mir jemand erklären warum ich ein string nicht so initialisieren kann:
string str(0x11, 0x0C, 0x35, 0x00, 0x00, 0x00,0x01);
aber sowas ist ohne Probleme möglich:
string str("Ich bin ein string");
was mache ich falsch :(..
Dankeee
Cimbom
-
cimbomgs schrieb:
Hallo Forum,
kann mir jemand erklären warum ich ein string nicht so initialisieren kann:
string str(0x11, 0x0C, 0x35, 0x00, 0x00, 0x00,0x01);
aber sowas ist ohne Probleme möglich:
string str("Ich bin ein string");
was mache ich falsch :(..
Dankeee
CimbomEs 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.
-
Hier, Escape-Sequenzen:
string str = "\x11\x0C\x35"; // und so weiter
-
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
-
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
-
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%2B0xCompilerSupportMSVC 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..
-
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};
-
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.
-
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.
-
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
.
-
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)
undMY_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 mitwchar_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...