String kürzen



  • Hallo!
    Bräuchte dringend Hilfe!!!
    Habe einen String Zahlen[], den ich um ein Zeichen kürzen muß.
    Kann mir vielleicht jemand dabei helfen?

    Bin dankbar für jee Antwort.



  • finde die länge des strings heraus und überschreibe das letzte zeichen mit dem üblichen "abschlusszeichen" des strings



  • Zum Abschluss würde ich aber an Deiner Stelle das Array kürzen; mit realloc z.B.



  • derBob schrieb:

    Zum Abschluss würde ich aber an Deiner Stelle das Array kürzen; mit realloc z.B.

    Wozu?



  • Wenn ich einen String allokiere und ihn dann um ein Zeichen kürze, dann ist doch

    int nLen=10;
    	int *zahlen=(int*)malloc(sizeof(int)*nLen);
    
    	zahlen=(int*)realloc(zahlen,sizeof(int)*(nLen-1));
    

    sinvoller, als das vorletzte Zeichen mit '\0' und dahinter noch reservierten Speicherplatz zu haben!



  • Ich halte das für Quatsch. Es kostet Zeit, und es bringt ein einziges Byte freien Speicher, das vermutlich häufig wegen unpassender Ausrichtung sowieso nicht genutzt werden kann.



  • Ein int besteht aber aus 4 Byte 😉



  • derBob schrieb:

    Ein int besteht aber aus 4 Byte 😉

    derBob schrieb:

    String ... ein Zeichen ... '\0'

    Irgendwas passt nicht zusammen. 😉



  • Stimmt! Ich bin von einem Array zahlen[] ausgegangen (Siehe mein Bsp).
    In deinem Fall wäre es natürlich nur 1 Zeichen - trotzdem ist es ratsam, nicht benötigten Speicher zur Benutzung freizugeben. Auch wenn das hier nicht zum Tragen kommt...



  • MFK schrieb:

    Ich halte das für Quatsch.

    Da bist du nicht der einzige. Es ist schlichtweg gesagt, vollkommener Blödsinn, wegen einem Zeichen realloc zu bemühen. Dynamischen Speicher reservieren und freigeben kostet nunmal Zeit. Und da sollte man sich schon sinnvolle Strategien erarbeiten, wann und wie man das macht. Zudem reicht ein realloc allein auch nicht aus. Das abschliessende Nullzeichen musst man trotzdem verschieben.



  • Da bist du nicht der einzige. Es ist schlichtweg gesagt, vollkommener Blödsinn, wegen einem Zeichen realloc zu bemühen. Dynamischen Speicher reservieren und freigeben kostet nunmal Zeit. Und da sollte man sich schon sinnvolle Strategien erarbeiten, wann und wie man das macht. Zudem reicht ein realloc allein auch nicht aus. Das abschliessende Nullzeichen musst man trotzdem verschieben.

    Ddu hast wohl noch nie auf Ressourcen-knappen Maschinen geschrieben, oder? 🙂
    Tatsache ist, dass man lieber realloc bemueht als am Ende Memoryleichen zu haben. Stell dir mal vor, du sagst das bei jedem deiner Strings.. "Och, wegen einem byte, da schreib ich kein realloc mehr". Bei 1024 Strings waeren das 1kb. Usw.



  • @[0x[90]| : Schön, das wenigstens auch Du das so siehst!



  • [0x[90]| schrieb:

    Ddu hast wohl noch nie auf Ressourcen-knappen Maschinen geschrieben, oder? 🙂

    Doch, hab ich. Allerdings mit weniger als 32KB musste ich noch nie auskommen. Und selbst da war eher die Geschwindigkeit das Problem, als das Einsparen von diesem oder jenen Byte.

    [0x[90]| schrieb:

    Tatsache ist, dass man lieber realloc bemueht als am Ende Memoryleichen zu haben.

    Wo hast du denn Memoryleichen, wenn du einfach nur das Nullzeichen änderst? Nirgendwo! Tatsache ist, dass man seiner Situation entsprechend vorgehen soll. Und wenn Bambusjunge für gängige x86 Hardware programmiert, dann gibt es keinen Grund wegen einem Byte realloc aufzurufen. Und das war selbst zu DOS Zeiten schon so.

    [0x[90]| schrieb:

    Stell dir mal vor, du sagst das bei jedem deiner Strings.. "Och, wegen einem byte, da schreib ich kein realloc mehr". Bei 1024 Strings waeren das 1kb. Usw.

    Na und? Was ist heutzutage 1 KB? Vielleicht hast du's noch nicht mitbekommen, aber wir leben nicht mehr in der Steinzeit. Jedes Programm hat heutzutage mehr ungenutzten Speicher durch Alignment, als du mit String-Byte-Einsparungen wieder reinholen kannst.
    Versteh mich nicht falsch, ich bin auch jemand, der optimiert, wenn es sinnvoll ist. Nur hier sehe ich keinen Grund dafür. Wozu 2 Sachen machen, wenn es mit einer auch getan ist. Und wenn du dich mal näher mit Speichermanagern befasst, dann wirst du 'eh merken, dass es letztendlich aufs gleiche hinausläuft, ob du realloc aufrufst oder nicht. Denn in den meisten Fällen kann das gewonnene Byte gar nicht wieder verwendet werden, weil es nicht aligned ist oder bis zum nächsten belegten Speicherbereich zu wenig Reserve ist, um es für irgendwas sinnvoll zu nutzen.



  • Das sind Mutmassungen welche du hier aufstellst. "Och, das Byte, ist vllt. sowieso nicht nutzbar". Ich koennte auch sagen: "Och, der Pointer, den muss ich nicht malloc'en, der Zeigt schon irgendwo auf geeigneten Speicher" 😉
    Ich fuer meinen Teil habe eine Funktion mit welcher ich strings in buffer kopiere und gleichzeitig den speicher (re)allociere. Als alternative koennte man free(); und strdup(); verwenden. Waere aber umstaendlicher.



  • [0x[90]| schrieb:

    Das sind Mutmassungen welche du hier aufstellst.

    Nee, das ist einfach nur ein bisschen Wahrscheinlichkeitsrechnung.

    [0x[90]| schrieb:

    Ich koennte auch sagen: "Och, der Pointer, den muss ich nicht malloc'en, der Zeigt schon irgendwo auf geeigneten Speicher" 😉

    Ich diskutiere gerne weiter, aber nur wenn du sinnvolle Argumente bringst.

    [0x[90]| schrieb:

    Ich fuer meinen Teil habe eine Funktion mit welcher ich strings in buffer kopiere und gleichzeitig den speicher (re)allociere. Als alternative koennte man free(); und strdup(); verwenden. Waere aber umstaendlicher.

    Und alles nur um einen String um 1 (in Worten ein!) Zeichen zu kürzen? Na super. Du schiesst sicherlich auch mit Kanonen auf Spatzen.



  • Apropos Mutmassung: Wer sagt, das der Speicher des Strings mit malloc geholt wurde? 😎

    Bye, TGGC (Denken, und gut ist.)



  • 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...


Anmelden zum Antworten