String kürzen
-
warum '\0' anhängen!?!?!?!
ist ja ein "ZAHLENARRAY"!!!mfG (c)h
PS.: ich würde den speicher auf alle fälle mal freigeben
-
chille07 schrieb:
warum '\0' anhängen!?!?!?!
ist ja ein "ZAHLENARRAY"!!!Niemand hat von anhängen gesprochen. Ausserdem war die Frage
Bambusjunge schrieb:
Habe einen String Zahlen[], den ich um ein Zeichen kürzen muß.
Und in C sind Strings immer noch nullterminiert. Keine Ahnung wie du auf "ZAHLENARRAY" kommst.
Wer lesen kann, ist klar im Vorteil.
-
mit dem "anhängen" habe ich mich verschrieben, ich meinte das letzte Zeichen mit '\0' überschreiben (das letzte das nicht '\0' ist)
"String" sind eigendlich Zeichenketten, jep..
ich habs mit einem Array verwechselt... dann wäre eher ein Zahlenarray gemeint"String zahlen[]"
mfG (c)h
-
chille07 schrieb:
mit dem "anhängen" habe ich mich verschrieben, ich meinte das letzte Zeichen mit '\0' überschreiben (das letzte das nicht '\0' ist)
"String" sind eigendlich Zeichenketten, jep..
ich habs mit einem Array verwechselt... dann wäre eher ein Zahlenarray gemeint"String zahlen[]"
mfG (c)h
da wir hier im ansi c forum sind, ging es wohl eher um nen string zahlen[] .. und n string lässt sich nur mit nem array von char darstellen.. und das kann man ja ruhig mit nem array verwechseln, is ja eins :). und n array is aber nicht immer n zahlenarray...
-
Apropos Mutmassung: Wer sagt, das der Speicher des Strings mit malloc geholt wurde?
Niemand. Kann natuerlich auch sein, dass er Variablen auf dem Stack verwendet. Ist es dann aber nicht so, dass durch umsetzen der \0 Speicher auch verloren geht? Ich meine, strlen gibt die laenge bis zur \0. Habe ich nun ein char bla[10] und setze \0 auf bla[4], ist alles vom 5ten bis zum letzten array weg, sofern man sich die tatsaechliche laenge nicht merkt, oder?
-
Durch Umsetzen des Nullzeichens geht überhaupt kein Speicher "verloren", egal wo der Speicher allokiert wurde. Das Nullzeichen ist nur eine Markierung für die Stringfunktionen. Mit der Größe des allokierten Speichers hat das gar nichts zu tun.
-
Ja, das ist klar. Du verstehst jedoch nicht das was ich sagen wollte: Wenn du nun die string funktion strlen nutzt um, nach setzen des \0 Zeichens die laenge des Puffers zu erfahren, wirst du nicht die komplette laenge zurueck bekommen sondern nur die, bis zum \0. D.h.: Hat man vorher die laenge des Puffers in einer variable abgespeichert, so wird man nicht mehr an sie herankommen. Oder etwa doch?
-
[0x[90]| schrieb:
Wenn du nun die string funktion strlen nutzt um, nach setzen des \0 Zeichens die laenge des Puffers zu erfahren, wirst du nicht die komplette laenge zurueck bekommen sondern nur die, bis zum \0.
strlen liefert auch vor dem Setzen eines Nullzeichens nicht die komplette Länge des Puffers. strlen ist nicht dazu da, die Länge des Puffers zu ermittlen. strlen liefert die Position des terminierenden Nullzeichen. Mit der Größe des allokierten Speichers hat das nichts zu tun.
Es gibt in Standard-C und Standard-C++ keine Funktion, die über einen Zeiger die Länge des allokierten Speichers liefert. Für Arrays kann man sizeof benutzen, ansonsten war's das.
D.h.: Hat man vorher die laenge des Puffers in einer variable abgespeichert, so wird man nicht mehr an sie herankommen. Oder etwa doch?
Verstehe ich nicht. Du kannst die Länge des Puffers und die Position des Nullzeichens in zwei getrennten Variablen speichern. Nochmal: Diese beiden Werte haben nichts miteinander zu tun.
-
Wenn ich mich recht erinner dient strlen() lediglich dazu, die Länge eines Strings zu ermitteln und fertig. Und da ist es schon sinnvoll, wenn strlen beim finden des Zeichens '\0' aufhört zu zählen und nicht noch die restlichen reservierten Bytes mitzählt. Das wäre ein falsches Ergebnis.
Edit: Ein Tick zu langsam
-
Ja mensch, dass weiss ich doch. Es ging aber doch darum, dass man den Speicher nach \0 verliert, wenn man nicht weiss wie gross der Puffer wirklich ist. D.h: Wenn \0 am Ende gesetzt ist, weiss ich wie gross er ist, strlen(). Setze ich \0 nun aber an [4], ist der rest weg. (vorausgesetzt ich habe die echte laenge nicht abgespeichert)
-
[0x[90]| schrieb:
Es ging aber doch darum, dass man den Speicher nach \0 verliert, wenn man nicht weiss wie gross der Puffer wirklich ist.
Mir ist nicht klar, was du in diesem Zusammenhang mit "verlieren" meinst.
D.h: Wenn \0 am Ende gesetzt ist, weiss ich wie gross er ist, strlen().
Nein, strlen + 1.
Setze ich \0 nun aber an [4], ist der rest weg.
Was meinst du mit "weg"? Durch Schreibzugriffe verschwindet kein Speicher. delete stört sich nicht am Inhalt des Speichers. Ich kann ja auch jederzeit wieder einen längeren String reinschreiben, solange ich die ursprüngliche Länge nicht überschreite.
-
Ich meine mit verlieren, dass man ihn wohl nicht mehr verwenden kann, da man nicht weiss wie weit der Speicher noch reicht. Du hast einen buffer, von welchem strlen() dir 4 zurueckgibt. Du hast davor die \0 jedoch auf die 5te stelle des buffers geschoben. D.h. du kennst den Wert der anfaenglichen initialisierung des Buffers nicht mehr. Der buffer koennte 10byte lang sein, oder 1024.
-
Du hast einen buffer, von welchem strlen() dir 4 zurueckgibt. Du hast davor die \0 jedoch auf die 5te stelle des buffers geschoben. D.h. du kennst den Wert der anfaenglichen initialisierung des Buffers nicht mehr. Der buffer koennte 10byte lang sein, oder 1024.
Ich weiß genau, wie lang der Puffer ist. Was mir strlen zurückgibt, interessiert mich gar nicht. Wenn ich mir die Länge eines Puffers merken muss, dann nutze ich dazu eine separate Variable, nicht strlen. Das ist nicht der Sinn und Zweck von strlen.
Wenn du strlen zur Bestimmung von Pufferlängen benutzt, dann ist klar, dass du nach jeder Änderung der Stringlänge realloc machen musst. Das liegt aber daran, dass strlen dafür ein ungeeignetes Werkzeug ist.
Du brauchst auch jedesmal neue Radmuttern, wenn du zum Radwechsel die Bohrmaschine benutzt.
-
[0x[90]| schrieb:
Ich meine mit verlieren, dass man ihn wohl nicht mehr verwenden kann, da man nicht weiss wie weit der Speicher noch reicht. Du hast einen buffer, von welchem strlen() dir 4 zurueckgibt. Du hast davor die \0 jedoch auf die 5te stelle des buffers geschoben. D.h. du kennst den Wert der anfaenglichen initialisierung des Buffers nicht mehr. Der buffer koennte 10byte lang sein, oder 1024.
Na und? Früher oder später machst du ein free oder ein realloc, weil du eine andere Operation machst bei der sich das lohnt und dann ist der Speicher wieder in Ordnung. Ein realloc braucht Zeit, das sollte man IMHO nicht bloß wegen einem popeligen Zeichen bemühen.
-
MFK schrieb:
Du brauchst auch jedesmal neue Radmuttern, wenn du zum Radwechsel die Bohrmaschine benutzt.
ROFL!
-
[0x[90]| schrieb:
Es ging aber doch darum, dass man den Speicher nach \0 verliert, wenn man nicht weiss wie gross der Puffer wirklich ist. D.h: Wenn \0 am Ende gesetzt ist, weiss ich wie gross er ist, strlen().
Das find ich ja mal amüsant. Benutzt du immer strlen zum Ermitteln der Länge eines Puffers? Was ist, wenn du mal keinen Puffer von char's hast? Oder ein Element kann einen gültigen Wert 0 haben?
Nochmal, nur weil man das Nullzeichen verschiebt geht kein Speicher verloren. Und wie gross der ursprüngliche Puffer ist, weisst du immer:short a[100]; long* b = malloc(200 * sizeof(long));
Wieviele Elemente hat nun a, und wieviele b?
-
Uff, nein. Ich nutze es nicht. Die Frage war auch nur allgemein erstellt. Ausserdem sage ich nicht, dass Speicher in dem sinne verloren geht sondern einfach nur dass man (bis zu einem realloc o.ae.) nicht mehr auf den kompletten String zugreifen kann.
-
[0x[90]| schrieb:
Ausserdem sage ich nicht, dass Speicher in dem sinne verloren geht sondern einfach nur dass man (bis zu einem realloc o.ae.) nicht mehr auf den kompletten String zugreifen kann.
Was denn nun? String, Puffer? Irgendwie hab ich das Gefühl, du verstehst das wirre Zeug, das du von dir gibst, selbst nicht mehr.
Du kannst auf den Speicher, den du irgendwann mal reserviert hast, egal ob Stack oder Heap, komplett zugreifen. Und das völlig unabhängig davon, wo denn nun irgendein Nullzeichen ist.
-
Omg, nun lasst es doch mal gut sein. Das hat sich doch schon geklaert.
Mit allokieren und dem Kram hat strlen eh nichts zu tun, demnach: vergiss es.
Und in meinem letzten Satz meinte ich natuerlich Buffer, nicht String. Kommt davon wenn man es 10 mal erklaeren muss...
-
[0x[90]| schrieb:
Omg, nun lasst es doch mal gut sein. Das hat sich doch schon geklaert.
Mit allokieren und dem Kram hat strlen eh nichts zu tun, demnach: vergiss es.
Und in meinem letzten Satz meinte ich natuerlich Buffer, nicht String. Kommt davon wenn man es 10 mal erklaeren muss...auch mit Buffer ist dein letzter satz völliger blödsinn.
MfG