Seite 1 von 1

Effekt bei stringfield () mit Trim ()

Verfasst: 27.10.2020 12:46
von reiner jakob
ich habe folgenden Effekt in Verbindung von Stringfield () und Trim ().
Auch zuerst den String an A$ übergeben und dann Trim () ausführen ändert nichts.

; Windows 7 64 Bit Rechner 32 bit Purebasic Version 5.2 LTS(x86)

Code: Alles auswählen

a$ = Trim(StringField(~"ABC   \t/   Franz",1,"/"))


Debug "*"+a$+"*"
;*ABC   	*

Debug Len (a$)
;7

For i=1 To Len(a$)
  Debug Asc(Mid(a$,i,1))
Next
; 65
; 66
; 67
; 32
; 32
; 32
; 9
Sieht jemand eine Lösung das Problem vorübergehend zu umgehen.

Edit by NicTheQuick: Code-Tags gesetzt und Tab wiederhergestellt, da das Forum Tabs in Spaces umwandelt

Re: Effekt bei stringfield () mit Trim ()

Verfasst: 27.10.2020 12:54
von #NULL
Du hast nicht gesagt was du erreichen willst. Und die tatsächliche Debug-Ausgabe stimmt nicht mit deinen Kommentaren überein:

Code: Alles auswählen

*ABC*
3
65
66
67

Re: Effekt bei stringfield () mit Trim ()

Verfasst: 27.10.2020 15:37
von NicTheQuick
Das ist kein Bug. Trim() entfernt standardmäßig nur Leerzeichen. Da das letzte Zeichen vor dem "/" bei dir aber ein TAB ist, klappt das nicht. Trim kann zwar auch andere Zeichen als nur Leerzeichen entfernen, aber man kann ihm leider keine ganze Klasse von Whitespaces übergeben:

Code: Alles auswählen

; Entfernt nur die Leerzeichen
Debug "*" + Trim(~"ABC   \t") + "*"
; Entfernt nur das Tab
Debug "*" + Trim(~"ABC   \t", ~"\t") + "*"
Zwei geschachtelte Trims werden auch nicht zum Erfolg führen, da das nicht funktioniert, wenn abwechselnd Tabs und Spaces enthalten sind.

Re: Effekt bei stringfield () mit Trim ()

Verfasst: 27.10.2020 15:59
von NicTheQuick
Ich hab dir mal ein Trim gebastelt, was deinen Ansprüchen genügen sollte:

Code: Alles auswählen

Procedure.s TrimW(text.s)
	Static whiteSpaces.i = %100000000000000000010111
	Protected *c.Character = @text, *b
	While *c\c And *c\c < 33 And whiteSpaces & (1 << (*c\c - 9))
		*c + SizeOf(Character)
	Wend
	*b = *c
	*c = @text + (Len(text) - 1) * SizeOf(Character)
	While *c > @text And *c>=*b And *c\c < 33 And whiteSpaces & (1 << (*c\c - 9))
		*c - SizeOf(Character)
	Wend
	ProcedureReturn PeekS(*b, (*c - *b) / SizeOf(Character) + 1)
EndProcedure

Debug TrimW(~"   \t\vHallo!\r\n  ")
Das entfernt horizontale und vertikale Tabs, Zeilenumbrücke, Wagenrückläufe und natürlich Leerzeichen am Anfang und Ende von Texten.

Außerdem verschiebe ich den "Bug" in ein anderes Forum.

Re: Effekt bei stringfield () mit Trim ()

Verfasst: 27.10.2020 17:08
von reiner jakob
Tja, erst mal danke

ich habe mir irgenwie das Tab ( 9 ) reingemogelt, beim suchen den Fehler weiterkopiert, und sogar selbst angezeigt, aber zu blöd gewesen die den richtigen Schluss zu ziehen. Danach bei dem Wunsch den Fehler vernünftig zu dokumentieren auch noch falsche Zeichen dazu eingetragen und vergessen die weg zu löschen.

Nochmals Danke und Entschuldigung für meine Dummheit.