Seite 1 von 1

String rückwärts ausgeben

Verfasst: 10.07.2008 02:03
von Delle
Hallo,

gibt's eine fertige Funktion in PB für sowas:

http://www.php4-forum.de/befehle/strrev.htm

Oder muss man das händisch programmieren mit einer Schleife wie hier:

Code: Alles auswählen

For i=Len(STR) To 1 Step -1:erg=erg+Chr(Asc(Mid(STR,i,1))):Next

Re: String rückwärts ausgeben

Verfasst: 10.07.2008 03:20
von nicolaus
Delle hat geschrieben:Hallo,

gibt's eine fertige Funktion in PB für sowas:

http://www.php4-forum.de/befehle/strrev.htm

Oder muss man das händisch programmieren mit einer Schleife wie hier:

Code: Alles auswählen

For i=Len(STR) To 1 Step -1:erg=erg+Chr(Asc(Mid(STR,i,1))):Next
In PB gibt es keine Funktion dafür, das mußt du dir selber schreiben, ist aber nicht viel aufwand.

Verfasst: 10.07.2008 09:12
von RSBasic

Code: Alles auswählen

String$="Hallo"
For a=Len(String$) To 1 Step -1
  Neustring$+Mid(String$,a,1)
Next
Debug Neustring$

Verfasst: 10.07.2008 09:20
von ZeHa
Unter Python find ich das irgendwie sehr praktisch:

Code: Alles auswählen

str = "Hallo"
print str[::-1]

Verfasst: 10.07.2008 10:34
von hjbremer
und nun etwas schneller, glaube ich

Code: Alles auswählen

;String umdrehen
;hjbremer PB 4.2 Win XP

Procedure.s StrRev(a$)

*start.character = @a$
*ende.character = *start + Len(a$) - 1

Repeat

    Swap *start\c, *ende\c    
    PokeC(*start, *start\c)
    PokeC(*ende, *ende\c)    
    *start + 1
    *ende  - 1

Until *start > *ende

ProcedureReturn a$

EndProcedure

a$ = "I love PureBasic"
a$ = StrRev(a$)

Debug a$


;und nun noch etwas schneller denke ich, aber mit Apibefehl lstrlen_

Procedure StrRev2(*start.character)

*ende.character = *start + lstrlen_(*start) -1

Repeat

    Swap *start\c, *ende\c    
    PokeC(*start, *start\c)
    PokeC(*ende, *ende\c)    
    *start + 1
    *ende  - 1

Until *start > *ende

EndProcedure

a$ = "I love PureBasic"

StrRev2(@a$)

Debug a$


Verfasst: 10.07.2008 12:16
von Hroudtwolf

Code: Alles auswählen

Structure tChar
   s.s { 1 }
EndStructure

Define.s       sEingabe    = "Hallo Welt"
Define.s       sAusgabe
Define.tChar   *Iterator   = @ sEingabe + StringByteLength ( sEingabe )
Define         *EOA        = @ sEingabe


While *EOA <= *Iterator
   sAusgabe + *Iterator\s
   *Iterator - SizeOf ( tChar )
Wend

Debug sAusgabe

Verfasst: 10.07.2008 14:17
von Kaeru Gaman
@Wolf

da ist aber ein denkfehler drin:
wenn man Unicode hat, dann landest du mit
@sEingabe + StringByteLength ( sEingabe )
auf dem zweiten byte des letzten zeichens.
also müßte das wohl besser
@sEingabe + StringByteLength ( sEingabe ) + 1 - SizeOf ( tChar )
heißen...

Verfasst: 10.07.2008 14:22
von Hroudtwolf
Dann probiers mal mit Unicode aus ;-)

Du wirst feststellen müssen dass der Denkfehler bei dir liegt.
StringByteLength liefert immer die zur Kodierung der Binary adäquate Menge an Bytes im String zurück.
Die Structure tChar besitzt die Länge eines Characters. Egal ob Unicode oder ASCII.

Verfasst: 20.07.2008 14:08
von AND51
Wollte auch noch hier mitmischen. Hier meine smarte Procedure:

Code: Alles auswählen

Procedure ReverseString(*Text.Character)
	Protected *ende.Character=*Text+MemoryStringLength(*Text)<<#PB_Compiler_Unicode-SizeOf(Character)
	While *Text < *Ende
		Swap *Text\c, *ende\c
		*Text+SizeOf(Character)
		*ende-SizeOf(Character)
	Wend
EndProcedure

test$="Hallo"
ReverseString(@test$)
Debug test$
@ hjbremer:
Damit will ich zeigen, dass dein Ansatz richtig und ein sehr guter ist.
Außerdem soll er dir deutlich machen, dass deine PokeC() aufrufe unnötig sind und zwar in beiden Proceduren.
Warum?
In beiden Fällen pokest du die Werte, die eh schon drin stehen. Und dein Repeat ersetzt du besser durch While! Denn das ist sicherer und schneller, da der Code gar nicht erst ausgeführt wird, wenn der String 0 oder 1 Zeichen lang ist.

Zu deiner Information: Schau dir mal die verschiedenen Befehle zum Ermitteln der Stringlänge an:
- Len()
- MemoryStringLength()
- StringByteLength()
- etvl. MemorySize()
Experimentiere damit herum in Sachen Handlichkeit und Performance. Dann hast du wieder eine Erfahrung mehr gewonnen, wenn du performant programmieren möchtest. :allright:

Verfasst: 23.07.2008 11:12
von Brügge
man kann ein programm schreiben, das auf der os alle eingaben invertiert...

an sich ist das prinzip einfach!

man überprüft, ob eine taste zwischen a und z gedrückt wurde... sollte dies der fall sein, dann soll das programm automatisch die taste pfeil nach links drücken.

wenn man jetzt wieder eine Taste drückt, wird diese vor der anderen taste gesetzt.

ist ein cooler trick um eine person zu ärgern... ^^




Code: Alles auswählen


repeat
  for i = 65 to 90
    if getasynckeystate_(i) or getasynckeystate_(#vk_space)
      keybd_event_(#vk_left,0,0,0): keybd_event_(#vk_left,0k#keyeventf_keyup,0)
      
    endif
    
  next i
delay(10)

if getasynckeystate_(#vk_escape):quit = 1:endif

until quit = 1