Funktion die die ganze String Laenge eines Arrays zurückgibt
-
Hi Leute!
Ich suche eine Funktion die die komplette Laenge eines Char arrays zurückgibt, und nicht wie strlen bei einem leerzeichen aufhört zu zählen... Habs mal selbst probiert bin aber nicht wirklich weit gekommen
-
So einfach geht das nicht! Meinst du die Länge, die bei der Array-Reservierung benutzt wurde? Ein String als Zeichenkette ist eben dadurch definiert, dass irgendwann '\0' kommt - woher soll die Funktion denn wissen, wie groß das Array wirklich ist - welcher Speicher reserviert wurde?
-
Also, ich habe zum Beispiel char eingabe[20],
nun lass ich den benutzer einen satz eingeben, weiß ja jetzt aber nicht wie lang der war, ob der benutzer nun 10 oder 15 Zeichen eingegeben hat. Gibt es da eine Möglichkeit diese zu zählen, auch über Leerzeichen hinweg?
-
Meinst Du sowas?
char array[20] = "Test Test"; int ctr = 0; while(array[ctr] != 0) ctr++; //<-enthaelt die Anzahl der Zeichen
-
Diese Funktion macht im Prinzip das gleiche wie strlen, d.h. bei '\0' ist Schluss, auch wenn dahinter noch (erlaubterweise) etwas steht. MasterCounter sucht soweit ich ihn verstanden habe, nach einer Möglichkeit die Länge eines Strings bzw char-Arrays zu bestimmen, auch wenn '\0' darin vorkommt. Das ist allerdings nicht möglich, da der Compiler von String und Array nur einen Zeiger auf das erste Element kennt, die Größe aber nicht. Genau aus diesem Grund sind Strings in C auch nullterminiert.
@MasterCounter: Ich hoffe, das war es was du gemeint hast. Ein Leerzeichen ist nämlich das, was du mit der Space-Taste erzeugst, und es wird von allen String-Routinen als normales Zeichen behandelt, d.h. auch von strlen mitgezählt.
-
@ Athalarich: Jo, hast recht. Beim ersten Posting von ihm habe ich das auch so verstanden wie Du, beim zweiten dann allerdings nicht. Deswegen dachte ich mir, ich versuch's mal ;). Naja, vielleicht klärt er uns ja gleich auf.
-
warum nicht einfach dass Leerzeichen durch ein anderes Symbol ersetzen (?):
int arr_size(char *szArr) { short i=0x00; while(szArr[i]!='\0') { if(szArr[i]=='\0') { szArr[i]='x'; i++; } else i++; } return i; }
-
Helmut` schrieb:
warum nicht einfach dass Leerzeichen durch ein anderes Symbol ersetzen
Äh... weil es unsinnig ist?
strlen liefert alle Zeichen bis zum '\0', inkl. aller Leerzeichen (sogar wenn das ganze Array nur aus Leerzeichen besteht)!
-
Äh... weil es unsinnig ist?
sag das doch nicht mir, ich hab nur ne funktion geliefert! das es auch mit strlen geht is mir schon bewusst... mir war auch nicht ganz bewusst, warum strlen die falsche länge zurückliefern soll, aber das ist mir ja auch egal.
-
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.)
-
Athalarich schrieb:
Das ist allerdings nicht möglich, da der Compiler von String und Array nur einen Zeiger auf das erste Element kennt, die Größe aber nicht. Genau aus diesem Grund sind Strings in C auch nullterminiert.
Nee, das ist nicht der Grund. Das hat einfach geschichtliche Gründe, man hätte Strings auch anders machen können, zB so wie in Pascal. Nullterminierte Strings gabs immerhin schon vor C.
@MasterCounter
Dein Problem ist schnell beantwortet. Das was du suchst, gibt es nicht. Das hat einfach damit zu tun, dass statische Arrays vom Typ T[N] bei jeder sich bietenden Gelegenheit nach T* umgewandelt werden. Und damit gehen sämtliche Informationen bezüglich der Grösse verloren. Bei dynamischen Arrays (malloc) fehlen diese Informationen sowieso. Da musst du dir halt merken, was du an malloc übergeben hast.
Und das musst du grundsätzlich machen, wenn du die Länge des Arrays brauchst.
-
groovemaster schrieb:
Athalarich schrieb:
Genau aus diesem Grund sind Strings in C auch nullterminiert.
Nee, das ist nicht der Grund. Das hat einfach geschichtliche Gründe, man hätte Strings auch anders machen können, zB so wie in Pascal. Nullterminierte Strings gabs immerhin schon vor C.
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. 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. Das ist eine andere Variante. Pascal verwendet afaik einfach char-Arrays mit 256 Elementen für einen String, was eine eher zweifelhafte Lösung ist.
-
suchst du sizeof() ??
-
sizeof liefert die größe, nicht die länge zurück
-
...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.