Letzte Stelle eines Strings löschen.

Anfängerfragen zum Programmieren mit PureBasic.
auxxon
Beiträge: 56
Registriert: 17.03.2005 14:30

Letzte Stelle eines Strings löschen.

Beitrag von auxxon »

Wie kann ich die letzte Stelle eines Strings löschen?
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

NeuerString$ = Mid(AlterString$, 1, Len(AlterString$)-1)

:D
Bild
BildDas ist Tux. Kopiere Tux in deine Signatur und hilf ihm so auf seinem Weg zur Weltherrschaft.
Benutzeravatar
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

Beitrag 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. :allright:

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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
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

Beitrag 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.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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 ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
BrunoF
Beiträge: 23
Registriert: 05.09.2004 22:29

Beitrag 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
Benutzeravatar
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

Beitrag 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.
Antworten