NUL-zeichen in strings



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


Anmelden zum Antworten