Funktion die die ganze String Laenge eines Arrays zurückgibt



  • Athalarich schrieb:

    Ich habe auch nicht bezweifelt, dass es anders auch gehen würde. Aber in C werden Strings nun einmal deshalb mit '\0' abgeschlossen, weil sonst nicht klar wäre, wann der String aus ist.

    Dann hast du dich vielleicht etwas ungenau ausgedrückt. Es hörte sich für mich halt so an, dass extra für C nullterminierte Strings eingeführt wurden, was aber nicht stimmt.

    Athalarich schrieb:

    In der STL von C++ wird das z.B. gelöst, indem ein std::string auch einen Zähler für die Größe enthält.

    Wie die Implementation von string aussieht, ist nicht vorgeschrieben. Wenn jemand einfach nur einen dynamischen C-String kapseln will, dann kann er das durchaus machen.

    Athalarich schrieb:

    Pascal verwendet afaik einfach char-Arrays mit 256 Elementen für einen String, was eine eher zweifelhafte Lösung ist.

    Was auch nur die halbe Wahrheit ist. Das erste Byte gibt nämlich die Länge an. Und da dieser Wert maximal 255 werden kann, werden für einen String maximal 256 Bytes verbraucht. Und zweifelhaft ist das auch nicht, nur limitiert.

    leo aka qsch schrieb:

    suchst du sizeof() ??

    Das nützt dir aber nur was, wenn du ein nichtdynamisches Array hast, welches noch nicht in die Zeigerdarstellung umgewandelt wurde. Dann kann man durchaus folgendes benutzen

    #define length_of(x) (sizeof(x) / sizeof(x[0]))
    

    MasterCounter schrieb:

    Ich habe den string nämlich mit scanf("%s",...) eingelesen, ich hab nicht gewusst, dass dabei das Einlesen beim ersten Leerzeichen abgebrochen wird!

    Schau dir mal die Formatspezifikationen an, da ist noch mehr möglich, zB

    scanf("%[ -~]", ...)
    

    um Strings des einfachen ASCII Zeichensatzes einzulesen.
    Das gibts auch als sichere Version, um Bufferoverflows zu vermeiden, ist aber afaik compilerspezifisch.



  • groovemaster schrieb:

    Bei dynamischen Arrays (malloc) fehlen diese Informationen sowieso. Da musst du dir halt merken, was du an malloc übergeben hast.

    irgenwo sollte es aber doch vermerkt werden. Wenn ich nach "malloc" "free" aurfrufe wird doch der ganze speicher den ich mir vorher mit malloc geholt hab freigegeben, ohne dass ich die exakte länge angebe.



  • groovemaster schrieb:

    Athalarich schrieb:

    In der STL von C++ wird das z.B. gelöst, indem ein std::string auch einen Zähler für die Größe enthält.

    Wie die Implementation von string aussieht, ist nicht vorgeschrieben. Wenn jemand einfach nur einen dynamischen C-String kapseln will, dann kann er das durchaus machen.

    Naja nicht ganz. Ein C-String kann keine Nullen enthalten, ein std::string dagegen schon. Auch ist vorgeschrieben, dass die length()-Operation auf einem std::string in konstanter Zeit abläuft, was effektiv der Forderung entspricht, den Längenzähler mit abzuspeichern.



  • schnedel schrieb:

    irgenwo sollte es aber doch vermerkt werden. Wenn ich nach "malloc" "free" aurfrufe wird doch der ganze speicher den ich mir vorher mit malloc geholt hab freigegeben, ohne dass ich die exakte länge angebe.

    Irgendwo wird das schon abgespeichert. Aber das weiss nur dein Speichermanager und es gibt afaik keine Standard Funktion um das zu ermitteln. Compilerspezifisch gibts da allerdings schon was.

    Bashar schrieb:

    Naja nicht ganz. Ein C-String kann keine Nullen enthalten, ein std::string dagegen schon.

    Hmm, dann kannst du dir ja merken, wie viele Nullzeichen ignoriert werden sollen, bis das entscheidende kommt. 🙂 Dabei fällt mir auf, dass c_str() dann ja uU nicht zufrieden stellend arbeitet. Nochmals, hmm.

    Bashar schrieb:

    Auch ist vorgeschrieben, dass die length()-Operation auf einem std::string in konstanter Zeit abläuft

    Das war mir so gar nicht bekannt. Ich dachte eigentlich, dass das nicht zwingend vorgeschrieben wird.


Anmelden zum Antworten