Seite 1 von 1

String zerlegen

Verfasst: 16.07.2012 18:05
von ThoPie
Hallo,
ich möchte einen gegebenen längeren String in relativ gleiche Stücke trennen. Am Besten mal ein Beispiel, ich kann das irgendwie nicht so formulieren.
Folgender String sei gegeben:

Code: Alles auswählen

"aaa bbbbb ccccc dddd e f g hhhhh iiiii"
Ich möchte nun, dass der String bei jedem Leerzeichen das z.B. nach dem 5.,10.,15. Zeichen kommt, dieses Leerzeichen ersetzen, um es dann mit StringField() zerflücken zu können. Das Resultat sollte wie folgt sein:

Code: Alles auswählen

"aaa bbbbb|ccccc|dddd e|f g hhhhh|iiiii"
Also Wörter sollen nicht geteilt werden. Ich möchte also gern eine Prozedur der Art:

Code: Alles auswählen

Procedure.s StringZerlegen(String.s,Stuecklaenge.i,ZeichenAlt.s,ZeichenNeu.s)
Kann mir jemand einen Tipp geben. Danke

Re: String zerlegen

Verfasst: 16.07.2012 18:34
von STARGÅTE

Code: Alles auswählen

Procedure.s StringZerlegen(String.s, Stuecklaenge.i, ZeichenAlt.c, ZeichenNeu.c) 
	Protected *Char.Character = @String
	Protected I.i
	While *Char\c
		For I = 1 To Stuecklaenge
			If *Char\c = #NUL
				Break
			EndIf
			*Char + SizeOf(Character)
		Next 
		While *Char\c
			If *Char\c = ZeichenAlt
				*Char\c = ZeichenNeu
				Break
			EndIf
			*Char + SizeOf(Character)
		Wend
		*Char + SizeOf(Character)
	Wend
	ProcedureReturn String
EndProcedure

Debug StringZerlegen("aaa bbbbb ccccc dddd e f g hhhhh iiiii", 5, ' ', '|')
Achtung, die beiden Zeichen hinten werden als Character übergeben, nicht als String!

Re: String zerlegen

Verfasst: 16.07.2012 18:38
von ThoPie
Man - wie schnell geht das denn.
Ich wollte nur einen Tipp, da liegt hier die fertige Lösung.
Danke schön. :allright:

Re: String zerlegen

Verfasst: 16.07.2012 18:46
von STARGÅTE
Vielleicht noch als Ergenzung (weil wir hier ja im Anfänger-Forum sind):

Mit *Char.Character = @String lasse ich mir die Adresse des Strings geben, und lese bzw. schreibe dann mit *Char\c im nachfolgendem Code immer direkt im Speicher. Das ist sehr viel schneller, als Buchstaben mit den String-Funktionen auszutauschen.
Mit *Char + SizeOf(Character) änder ich dann die Adresse auf das nächte Zeichen (Ascii: 1Byte, Unicode: 2Byte).