Frage zu '\0' in Strings ( char * arrays[] )



  • '\0' definiert das Ende eines Strings.

    Wie speichere ich dann mehrere '\0' in einem String, ohne dass die Stringlänge falsch interpretiert wird?



  • Ein String ist beim ersten Vorkommen von \0 zu Ende.

    Was möchtest Du denn erreichen?



  • std::string kann das. Du musst nur bei der Konstruktion etwas aufpassen:

    #include <iostream>
    #include <string>
    
    int main() {
      char foo[] = "Hel\0lo,\0\0 World\0\0!\0!";
      std::string s(foo, foo + sizeof(foo));
    
      std::cout << s.size() << std::endl;
      for(std::string::const_iterator i = s.begin(); i != s.end(); ++i)
        std::cout << int(*i) << std::endl;
    }
    


  • Trotzdem stellt sich die Frage nach dem Sinn mehrerer \0 in einem String. Mir zumindest.



  • Joe_M. schrieb:

    Ein String ist beim ersten Vorkommen von \0 zu Ende.

    Was möchtest Du denn erreichen?

    Ich frage mich wie man in so einem char-array-string eben das Ende sicher erkennen kann ohne die Stringklassen zu nutzen.
    Früher gab es die ja auch nicht da muss man das doch auch irgendwie hinbekommen haben.

    Iteriere ich z.B. 'old school' über einen solchen String erkenne ich das
    Ende erst, wenn '\0' auftaucht. Taucht aber schon vorher das '\0' auf,
    kann ich ja nicht sicher das Ende erkennen und der Rest nach dem ersten
    '\0' überspringe ich somit.



  • Du kannst z.B. die Länge in die ersten paar Byte des Arrays schreiben, oder ein struct a la

    struct my_counted_string {
      char *data;
      size_t size;
    };
    

    benutzen, aber was spricht gegen die String-Klassen? Das ist da wohl das einfachste.



  • '\0' ist das Ende des Strings. ist halt so.

    ansonsten wie gesagt stringklassen verwenden



  • Joe_M. schrieb:

    Trotzdem stellt sich die Frage nach dem Sinn mehrerer \0 in einem String. Mir zumindest.

    anonym24 schrieb:

    Ich frage mich wie man in so einem char-array-string eben das Ende sicher erkennen kann ohne die Stringklassen zu nutzen.
    Früher gab es die ja auch nicht da muss man das doch auch irgendwie hinbekommen haben.

    In der Win32-API wird das z. Bsp. beim Filterstring (lpstrFilter) des OPENFILENAME-struct für File-Dialoge verwendet. Das Ende wird dort durch zwei aufeinanderfolgende '\0' symbolisiert.
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/commondialogboxlibrary/commondialogboxreference/commondialogboxstructures/openfilename.asp



  • 0xdeadbeef schrieb:

    Du kannst z.B. die Länge in die ersten paar Byte des Arrays benutzen, aber was spricht gegen die String-Klassen? Das ist da wohl das einfachste.

    Nichts, da war nur eine rein theoretische Frage.

    Wie bekomme ich eigentlich die Länge von einem Array in C++ zur Laufzeit raus?

    In Java geht das mit array.lenght . Da in C++ Arrays keine Objekte sind,
    wie mache ich das hier?

    In Java:
    byte[] array = {'B','c','l','a'};

    for (int i=0; i <= array.lenght; i++)
    if (array[i] == 'a')
    System.out.println("a gefunden");

    In c++

    char *array = "Blavdsdhkjshf";

    for (int i=0; i<= ????; i++)
    if (array[i] == 'a');
    cout << "a gefunden";



  • anonym24 schrieb:

    Wie bekomme ich eigentlich die Länge von einem Array in C++ zur Laufzeit raus?

    In c++

    char *array = "Blavdsdhkjshf";

    for (int i=0; i<= ????; i++)
    if (array[i] == 'a');
    cout << "a gefunden";

    Kommt drauf an. In diesem Falle z.B. mit der Funktion strlen(const char*), welcher du den char* übergibst, dessen Länge du wissen möchtest.

    Ansonsten wenn du ein wirkliches (statisches) Array (also ein T[] und nicht ein T*), dann ergibt sizeof(arrayname) / sizeof(arrayname[0]); die Anzahl der Elemente des Arrays.

    Bei den 'normalen' dynamischen Arrays ist mir keine andere Möglichkeit bekannt als sich die Länge direkt bei der Allokation des Speichers zu merken.

    Desweiteren gibt es in C++ aber noch die Klasse std::vector, die ein (statisches oder dynamisches) Array darstellt (und noch dazu einfacher und komfortabler zu bedienen ist). In ihr gibt es eine Methode size(), welche die Anzahl der Elemente des Arrays zurückgibt.

    Caipi


Log in to reply