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
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:
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.

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