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
-