Funktion die die ganze String Laenge eines Arrays zurückgibt
-
...was in dem Fall heißen würde, dass du die Größe eines Zeigers auf char (char*) erhältst. mit der du in diesem Fall nichts anfangen kannst, da sie über das, worauf der Zeiger verweist, nichts aussagt.
-
Erstmal vielen Dank für die vielen Antworten!
Das was ich gesucht habe hat mir mata schon beantwortet:mata schrieb:
Also mal vorneweg, Leerzeichen != '\0' !!!!!!!!!!!!!!!!!
strlen zählt alle Zeichen bis '\0' , natürlich auch alle Leerzeichen! Also sollte strlen genau das sein, was mastercounter sucht. vielleicht macht er einen fehler beim einlesen, vielleicht hört deine einleseroutine bei dem ersten leerzeichen auf! (bei scanf("%s",str) z.B.)
Ich habe den string nämlich mit scanf("%s",...) eingelesen, ich hab nicht gewusst, dass dabei das Einlesen beim ersten Leerzeichen abgebrochen wird!
Dann werd ich das ab jetzt wohl besser mit gets() machen!Also, nochmals vielen Dank, seid echt ein gutes Team hier im Forum!
-
Dann werd ich das ab jetzt wohl besser mit gets() machen
das ist eine nicht so feine funktion da du hier riskierst in speicher rumzuschreiben der dir nicht gehört...
nimm lieber fgets
-
Verwende lieber fgets, mit der kannst du die Eingabe begrenzen.
-
@Helmut`
erster
-
-
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.