Seite 1 von 2

Einem String nach jedem Buchstaben ein Leerzeichen geben ?

Verfasst: 05.01.2008 18:07
von Fusselohr
Guten Abend an alle Progger da draußen <),

Ich habe ein Problem...
Und zwar soll...

Der String:

Code: Alles auswählen

Hallo ich bin ein String. 
Soll zu:

Code: Alles auswählen

H a l l o  i c h  b i n  e i n  S t r i n g .
werden. Aber leider komme ich nur soweit dass der String so aussieht:

Code: Alles auswählen

H l o i h...
usw.

Kann mir denn jemand helfen ?
Fusselohr

Verfasst: 05.01.2008 18:15
von milan1612

Code: Alles auswählen

Procedure.s Spacifize(string.s)
  Protected newstr.s
  Protected *ptr.Character = @string
  While *ptr\c
    If Len(newstr) > 0
      newstr + " "
    EndIf
    newstr + Chr(*ptr\c)
    *ptr + SizeOf(Character)
  Wend
  ProcedureReturn newstr
EndProcedure

Debug Spacifize("Hallo ich bin ein String.")
So etwa?

Verfasst: 05.01.2008 18:17
von mk-soft
War jemand schneller, muss aber nicht immer alles gleich mit Pointern für Anfänger sein.

Code: Alles auswählen

Procedure.s DoppelString(String.s, Separator.s = " ")

  Protected helpstring.s, len, i
  
  len = Len(String)
  For i = 1 To len
    helpstring + Mid(String, i, 1) + Separator
  Next
  ProcedureReturn helpstring
  
EndProcedure

Debug DoppelString("Hallo ich bin ein String")
FF :wink:

Verfasst: 05.01.2008 18:22
von Fusselohr
Danke euch beiden ^^. Ihr habt mir wirklich geholfen :allright:

Verfasst: 05.01.2008 18:29
von milan1612
@mk-soft

Hab grad zum Spaß mal ein paar Tests gemacht, deine Methode
ist um fast ein Drittel schneller als meine :freak: :shock:
PB's Mid Befehl hats anscheinend echt drauf... :allright:

Verfasst: 05.01.2008 18:34
von Macros
Einen großen Teil mach sicher aus, das du jedes mal Len aufrufst

Teste mal kurz einfach das hier:

Code: Alles auswählen

Procedure.s Spacifize(string.s)
  Protected newstr.s,first.l
  Protected *ptr.Character = @string
  While *ptr\c
    If first
      newstr + " "
    Else
      first=1
    EndIf
    newstr + Chr(*ptr\c)
    *ptr + SizeOf(Character)
  Wend
  ProcedureReturn newstr
EndProcedure 

Verfasst: 05.01.2008 18:38
von milan1612

Code: Alles auswählen

Procedure.s Spacifize(string.s)
  Protected newstr.s,first.l
  Protected *ptr.Character = @string
  While *ptr\c
    If first
      newstr + " "
    Else
      first=1
    EndIf
    newstr + Chr(*ptr\c)
    *ptr + SizeOf(Character)
  Wend
  ProcedureReturn newstr
EndProcedure

Procedure.s DoppelString(String.s, Separator.s = " ")
  Protected helpstring.s, len, i
  len = Len(String)
  For i = 1 To len
    helpstring + Mid(String, i, 1) + Separator
  Next
  ProcedureReturn helpstring
EndProcedure

x = ElapsedMilliseconds()
For i = 1 To 100000
  Spacifize("Hallo ich bin ein String")
Next
res1 = ElapsedMilliseconds() - x

x = ElapsedMilliseconds()
For i = 1 To 100000
  DoppelString("Hallo ich bin ein String")
Next
res2 = ElapsedMilliseconds() - x

MessageRequester("Result 1", Str(res1))
MessageRequester("Result 2", Str(res2))
Result 1 = 859
Result 2 = 641
:freak:

EDIT:
Wenn ich den Check komplett rausnehme und dann am Schluss
einfach Trim() nehme ist meine schneller:

Code: Alles auswählen

Procedure.s Spacifize(string.s)
  Protected newstr.s
  Protected *ptr.Character = @string
  While *ptr\c
    newstr + " " + Chr(*ptr\c)
    *ptr + SizeOf(Character)
  Wend
  ProcedureReturn Trim(newstr)
EndProcedure

Verfasst: 05.01.2008 18:48
von AND51
Warum jagst du alle Werte durch Chr()? Das verlangsamt deinen Code doch auch!
ich grüble auch grade an einer Lösung, die euch alle in den Schatten stellt *muahaha* >:)

P.S.: Viellicht ne doofe Frage, aber weiß jemand, ob und wenn ja wo es schon Dokumentationen zur Version 4.20 gibt? Oder muss ich alle Befehle (so auch das neue Mid()) selbst ausprobieren?

Verfasst: 05.01.2008 18:50
von milan1612
Beim 'neuen' Mid ist einfach der letzte Parameter optional...

Verfasst: 05.01.2008 18:52
von AND51
Danke! Und dann? Schnibbelt der den String bis zum Ende aus, wenn ich nichts angebe?
Gibts denn keine Art Dokumentation? Muss ja nicht auf Deutsch sein, aber irgendetwas ausführlicheres als den Changelog würd ich mir schon wünschen... :|