Seite 1 von 1
Letzte Stelle eines Strings löschen.
Verfasst: 27.03.2005 20:27
von auxxon
Wie kann ich die letzte Stelle eines Strings löschen?
Verfasst: 27.03.2005 20:30
von 125
NeuerString$ = Mid(AlterString$, 1, Len(AlterString$)-1)

Verfasst: 27.03.2005 20:50
von NicTheQuick
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.
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
Verfasst: 31.03.2005 09:24
von Kaeru Gaman
@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.
Verfasst: 31.03.2005 15:35
von NicTheQuick
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.
Verfasst: 31.03.2005 21:02
von Kaeru Gaman
ich meinte die ganze stringverwaltung händisch zu proggen,
mir war nicht klar, dass win oberhalb von PB den kompletten stringspeicher im hinterkopf hat

Verfasst: 01.04.2005 13:00
von BrunoF
NeuerString$ = Mid(AlterString$, 1, Len(AlterString$)-1)
Wen Du den ursprüngliche Inhalt des Strings nicht mehr benötigst dann kanst Du das Ergebnis auch dem ersten String zuweisen.
Code: Alles auswählen
AlterString$ = Mid(AlterString$, 1, Len(AlterString$)-1)
@NTQ
Bringt deine Funktion einen Vorteil in der Geschwindigkeit oder wolltest Du nur eine alternative Variante darstellen?
BrunoF
Verfasst: 01.04.2005 13:41
von NicTheQuick
Ich habe noch keinen Geschwindigkeitstest angestellt, aber ich glaube die zweite Funktion ist schneller als die anderen beiden.
Vielleicht hat ja mal jemand Lust einen Test zu machen.