\0 finden in std::string



  • static char foo[] = "Hallo\0Welt";
    string s(foo, foo + sizeof(foo));
    

    jetzt sollte es theoretisch tun



  • Optimizer schrieb:

    Das ist ziemlich offensichtlich. Dein String s lautet "Hallo", da er bei der '\0' zu Ende ist. Im String "Hallo" kommt deine '\0' aber nicht vor, deshalb wird der Fluchtwert npos zurückgeliefert, um zu signalisieren, dass das Element nicht vorkommt.

    Ich dachte auch so wie es Mis2com sagte, das \0 bei std::string nicht das Stringende bedeutet.



  • Ahhhhh, ich glaube ich verstehe :-))))

    Dem String wird nur "Hallo" zugewiesen im Konstruktor von std::string.

    Vielen Dank Bashar.



  • \0 wird bei der Konvertierung von const char* -> string schon als Stringende betrachtet, verbleibt im Nachhinein aber nicht als \0 im String.
    Wie soll die string-Klasse feststellen, ob das \0 was ankommt das 1. im String ist und nur das 2. gewichtet werden soll? Das Teil übergibt ja lediglich einen zeiger auf das erste Element, nicht mehr.

    MfG Eisflamme



  • Die '\0' ist ebenfalls als Ende-Markierung im std::string enthalten. Dass die Länge vorrätig gehalten wird, hat eher Performance-Gründe.
    Funktionen wie c_str() würden auch gar keinen Sinn mehr geben, wenn die '\0' nicht enthalten wäre.
    Da es aber nur das Ende-Zeichen ist wird es bei der Suche natürlich nicht als Treffer gewertet, weil rein Logisch die '\0' nicht enthalten ist. Eigentlich ist die '\0' nur ein Erbe aus C-Zeiten..



  • Optimizer schrieb:

    Die '\0' ist ebenfalls als Ende-Markierung im std::string enthalten.

    Wieso?

    Dass die Länge vorrätig gehalten wird, hat eher Performance-Gründe.

    Wie erklärst du dann das funktionieren von bashars code?

    Funktionen wie c_str() würden auch gar keinen Sinn mehr geben, wenn die '\0' nicht enthalten wäre.

    Und welchen Sinn hat dann data() ?

    Da es aber nur das Ende-Zeichen ist wird es bei der Suche natürlich nicht als Treffer gewertet, weil rein Logisch die '\0' nicht enthalten ist.

    In bashars code allerdings schon...

    Eigentlich ist die '\0' nur ein Erbe aus C-Zeiten..

    Und std::string ist kein relikt aus C zeiten und leidet zum glück nicht darunter...

    allerdings ist "hallo\0welt"
    ein C string
    und wenn man jetzt
    str="hallo\0welt";
    macht, behandelt der op= den C string natürlich als C string und nimmt \0 als endmarkierung. Woher sollte er auch sonst die länge bekommen. wenn man es aber wie bashar macht:
    str.assign(foo, foo+sizeof(foo));
    würde find sehrwohl die \0 finden.



  • Ok, das überrascht mich ehrlich gesagt, weil ich vor langer Zeit das mal anders gelernt habe. Ich finde es natürlich gut, dass es so ist, wie es ist.
    Sorry, für die Fehlinformation...



  • Hi nochmal,

    ich brauche einen String wo nur ein \0 drin ist.

    Wie ist es richtig:

    std::string s1("", 1);
    

    oder so:

    std::string s2("\0", 1);
    


  • oder so? 🤡

    std::string s3(1, '\0');
    


  • Hi,

    "\0" wird zu '\0' '\0'

    std::string s3(1, '\0');

    müsste auch gehen, bin da unsicher.

    std::string s1("", 1);

    sollte auch ok gehen.

    MfG Eisflamme


Anmelden zum Antworten