Letzte Stelle eines Strings löschen.
Letzte Stelle eines Strings löschen.
Wie kann ich die letzte Stelle eines Strings löschen?
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Ich habe mal eben zwei Funktionen geschrieben, die das relativ schnell machen sollten. Bei der ersten ist die Angabe der Länge des Strings Voraussetzung. Die zweite Funktion errechnet die Länge selbst und löscht dann das letzte Zeichen. Allerdings bin ich mir nicht sicher, ob man das so machen darf, wobei es bisher gut funktionierte, aber es sicherlich bessere Methoden dafür gibt. Vielleicht ist sogar der [c]Len()[/c]-Befehl dafür besser geeignet.
Wer mag, kann ja mal einen Speedtest durchführen.
///Edit: Hab vorhin vergessen, die Funktionen zu posten. Deeem2031 hat mich darauf aufmerksam gemacht.
Wer mag, kann ja mal einen Speedtest durchführen.
///Edit: Hab vorhin vergessen, die Funktionen zu posten. Deeem2031 hat mich darauf aufmerksam gemacht.

Code: Alles auswählen
Procedure DeleteLastChar1(*String.BYTE, Length.l)
If *String
*String + Length - 1
*String\b = 0
EndIf
EndProcedure
Procedure DeleteLastChar2(*String.BYTE)
Protected Size.l, IsNull.l
Size = GlobalSize_(*String)
IsNull = #False
*String + Size
Repeat
If *String\b = 0 : IsNull = #True : EndIf
If IsNull And *String\b
*String\b = 0
ProcedureReturn #True
EndIf
*String - 1
ForEver
ProcedureReturn #False
EndProcedure
Text.s = "hallo du da!"
Length.l = Len(Text)
Debug Text
;DeleteLastChar1(@Text, Length)
DeleteLastChar2(@Text)
Debug Text
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
@NTQ
das problem bei deiner methode sehe ich darin, das du ein totes byte zurückbehältst.
bei der verwendung von Left() oder Mid() könnte ich mir vorstellen,
dass das bereinigt wird, sicher bin ich aber nicht.
wenn du unbedingst über pointer und selbstzugewiesenen Speicher arbeiten möchtest,
wäre evtl. ein kopieren und eine explizite freigabe des alten speichers sinnvoll.
das problem bei deiner methode sehe ich darin, das du ein totes byte zurückbehältst.
bei der verwendung von Left() oder Mid() könnte ich mir vorstellen,
dass das bereinigt wird, sicher bin ich aber nicht.
wenn du unbedingst über pointer und selbstzugewiesenen Speicher arbeiten möchtest,
wäre evtl. ein kopieren und eine explizite freigabe des alten speichers sinnvoll.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Es wird kein totes Byte zurückgelassen. Es stehen dann zwar am Ende zwei Nullbytes, aber bei weiteren Stringoperationen wird auch wieder der komplette Speicherbereich, den der String vorher genutzt hatte, geändert.
Das letzte Byte wird dann schon nicht vergessen. Du musst daran denken, dass Windows die Speicherverwaltung selbst macht und es somit auch egal ist, ob am Schluss Nullbytes oder irgendwelche anderen Bytes stehen. PureBasic muss beim Freigeben des Strings nicht die Länge angeben, sondern nur den Pointer zum String.
Und was meinst du mit selbstzugewiesenem Speicher? Ich weise hier keinen neuen Speicher zu.
Das letzte Byte wird dann schon nicht vergessen. Du musst daran denken, dass Windows die Speicherverwaltung selbst macht und es somit auch egal ist, ob am Schluss Nullbytes oder irgendwelche anderen Bytes stehen. PureBasic muss beim Freigeben des Strings nicht die Länge angeben, sondern nur den Pointer zum String.
Und was meinst du mit selbstzugewiesenem Speicher? Ich weise hier keinen neuen Speicher zu.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Wen Du den ursprüngliche Inhalt des Strings nicht mehr benötigst dann kanst Du das Ergebnis auch dem ersten String zuweisen.NeuerString$ = Mid(AlterString$, 1, Len(AlterString$)-1)
Code: Alles auswählen
AlterString$ = Mid(AlterString$, 1, Len(AlterString$)-1)
Bringt deine Funktion einen Vorteil in der Geschwindigkeit oder wolltest Du nur eine alternative Variante darstellen?
BrunoF
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken