NUL-zeichen in strings
-
hi :),
ist es möglich NUL-zeichen (\0 oder \x00) mitten in einen string zu stecken sodass der compiler oder das programm den ganzen string erkennt?
weil bei zb
string bla "bl\0a"liest der nur "bl" aus (\0 kennzeichnet ja normalerweise das ende eines strings)
gibt es da workarrounds oder wie muss ich vorgehen?
-
Da kommst du mit C++-Strings nicht weiter. Eine Alternative wäre
std::vector<char>.
-
std::string bla = "bl"; bla += '\0'; bla += 'a';
-
string bla("bl\0a", 4);
-
jo danke klappt

*closed*
-
Is aber sehr doof. Wenn du mal irgendwelche Funktionen verwenden willst die C-Strings benötigen dann hast du sowas von ein Problem...
-
neomic schrieb:
...
ist es möglich NUL-zeichen (\0 oder \x00) mitten in einen string zu stecken sodass der compiler oder das programm den ganzen string erkennt?...Ja, aber wozu ?
Vielleicht können wir Dir hier bessere Möglichkeiten nennen. Wie David schon gesagt hat, ist es unüblich und unerwartet und damit recht fehlerträchtig.
Gruß,
Simon2.
-
Es ist möglich, solange du den String nicht als C-String interpretieren willst. Und sowas ist auch üblich, um z.B. eine längere Stringliste zu übergeben (z.B. verwenden diverse WinAPI-Funktionen solche String-Folgen (ein einzelnes '\0' markiert das Ende eines Teilstrings ein doppeltes das Listenende)).
-
Naja,
Du sprichst hier von einem speziellen Protokoll ... ich sprach eher von dem, was 90% der C++Programmierer erwarten, wenn sie ".... einen String ..." hören.
Und dazu zählt z.B. auch, dass man den gefahrlos und komplett mit strncpy() in ein char[] kopieren kann (wie wir gerade im anderen Thread gesehen haben).Gruß,
Simon2 (der noch nie WinAPI programmiert hat).
-
Aber ein C++ String (sprich std::basic_string) muß nicht Null-terminiert sein. Wenn du z.B. data() aufrufst, kann dieser ohne Nullterminierung zurück gegeben werden, eben weil C++ Strings im Gegensatz zu C-Strings nicht Null-terminiert sein müssen. Können! Aber nicht müssen!
Also kann man nicht wirklich von 90-100% der Fälle sprechen. Davon geht ihr jetzt aus, weil ihr immer noch die C-Denke habt.
Wenn neomic eine \0 drin haben will, dann ist das laut std::basic_string keine Terminierung. Die Terminierung mit Null, muß allerdings bei c_str() sein! Deshalb gibts data() und c_str().
-
Es wird Dich vielleicht überraschen, aber all das wusste ich bereits.
In "meinem" Projekt arbeite ich sowohl mit "printable Strings" als auch mit nonprintables (jeweils in std::string) und freue mich über die Unterscheidung von data() und c_str().
Ich sprach nur von string::c_str() ... war doch klar, oder ?
Ich sprach davon, dass man strncpy() einsetzt und damit war für mich (im Sinne von ADL
) klar, dass es hier um die Konvertierung und das Arbeiten mit C-Strings geht. 
Artchi schrieb:
...Also kann man nicht wirklich von 90-100% der Fälle sprechen. Davon geht ihr jetzt aus, weil ihr immer noch die C-Denke habt....

Was soll das Eine mit dem Anderen zu tun haben ? Wenn 90% das erwarten, tun sie das .... egal, ob aus (in Deinen Augen) "edlen Motiven" oder nicht.Artchi schrieb:
Wenn neomic eine \0 drin haben will, ...... dann vermute ich gaaaanz stark, dass er das als Terminierung in seinen C-Strings haben will.
Weil ich das aber nicht weiß, habe ich gefragt, wozu er das braucht.Gruß,
Simon2.
-
Na, vielleicht wissen das aber die vielen anderen Threadleser nicht?

-
OK,
weil Du mich zitiert hattest, war ich der Ansicht, Du wolltest das mir persönlich mitteilen.
Sorry und frohe Weihnachten,
Simon2.