sachen gibts die gibts gar nicht
-
haltet mich nicht direkt für bescheuert, ich hab das wirklich ^^
also ich habe eine variable wie folgt:
char x[9];
und irgendwann später im programm:
strlen(x) ist 13...
wie kann das sein??
-
strlen zählt bis zur ersten '\0'. Und die scheint erst an Position 13 vorzuliegen.
Meinst Du möglicherweise sowas wie sizeof()?
-
meine wenigkeit schrieb:
und irgendwann später im programm:
genau da ist die lösung. "irgendwann" kann ein verdammt langer zeitraum sein, in dem viel passieren kann. Da also soviel code zwischen char x[9]; und strlen(x); liegt. Hätte ich micht eher gewundert, wenn 9 rausgekommen wäre
-
zählt der wirklich ab dem speicher wo x anfängt bis zum ersten \0? interessiert es den gar nicht dass der definitionsbereich der variablen aufhört?
-
meine wenigkeit schrieb:
zählt der wirklich ab dem speicher wo x anfängt bis zum ersten \0? interessiert es den gar nicht dass der definitionsbereich der variablen aufhört?
Strlen weiss nicht wo der Bereich aufhört, da es einen Zeiger entgegennimmt. Es ist Deine Aufgabe dafür zu sorgen, dass bis zur neunten Stelle ein Nullbyte enthalten ist.
-
mit \0 wird ja gesagt, dass dort der definitionsbereich aufhöhrt
-
okay.. und wie sieht das mit den print-routinen aus? die verfahren dann genauso?
-
oder mal anders gefragt: hängt die strcpy-routine nicht automatisch ein \0 dran?
-
Alle Funktionen die mit C-Strings arbeiten (die als char* oder const char* durch die Lande gereicht werden), verlassen sich auf gültige Nullterminierung.
Strcpy hängt automatisch ein \0 ran, sobald er mit kopieren fertig ist. Auch hier gilt: Der Quellstring muss nullterminiert sein, damit strcpy weiss wo Ende ist, sonst kopiert strcpy bis Ultimo und semmelt dabei gnadenlos über Deinen Zielbereich hinaus.
-
also sollte ich wenn ich genau 9 zeichen in meinem string haben will eine variable mit char x[10] definieren und an die letzte stelle immer ein \0 packen?!
-
Ja, Du brauchst für C-Strings immer ein char mehr Speicher als der Text tatsächlich lang ist.