Einem String nach jedem Buchstaben ein Leerzeichen geben ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Fusselohr
Beiträge: 236
Registriert: 02.04.2007 10:43
Kontaktdaten:

Einem String nach jedem Buchstaben ein Leerzeichen geben ?

Beitrag 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
Mein Projekt besteht immernoch und wächst stündlich.

Du willst die Entwicklung mitverfolgen ?
Dann besuche jetzt den Entwicklungsblog unter
http://rpg-fire-games.blogspot.com/
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag 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?
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Fusselohr
Beiträge: 236
Registriert: 02.04.2007 10:43
Kontaktdaten:

Beitrag von Fusselohr »

Danke euch beiden ^^. Ihr habt mir wirklich geholfen :allright:
Mein Projekt besteht immernoch und wächst stündlich.

Du willst die Entwicklung mitverfolgen ?
Dann besuche jetzt den Entwicklungsblog unter
http://rpg-fire-games.blogspot.com/
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag 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:
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag 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 
Bild
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag 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
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

Beim 'neuen' Mid ist einfach der letzte Parameter optional...
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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... :|
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten