String rückwärts ausgeben

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

String rückwärts ausgeben

Beitrag 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
PB 6.21 | Win 11
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Re: String rückwärts ausgeben

Beitrag 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.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

Code: Alles auswählen

String$="Hallo"
For a=Len(String$) To 1 Step -1
  Neustring$+Mid(String$,a,1)
Next
Debug Neustring$
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Unter Python find ich das irgendwie sehr praktisch:

Code: Alles auswählen

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

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag 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$

Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
Hroudtwolf
Beiträge: 1416
Registriert: 30.10.2004 23:33
Kontaktdaten:

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Hroudtwolf
Beiträge: 1416
Registriert: 30.10.2004 23:33
Kontaktdaten:

Beitrag 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.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

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

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Brügge
Beiträge: 359
Registriert: 28.05.2006 16:40
Wohnort: Rheine

Beitrag 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
Abgeschlossene games: No Name Game (NNG) Download-Link:
http://web56.login-1.loginserver.ch/eas ... 2125104111
Antworten