ReplaceString Zeichen an Index-Stelle ...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

ReplaceString Zeichen an Index-Stelle ...

Beitrag von Xaby »

Hallo Fans ...

Gibt es einen PB-Befehl, der genau das macht:



Text$ ist der Text, an dessen Stelle k eine Zeichenkette der Länge C$
mit dem Inhalt C$ eingefügt werden soll.

Code: Alles auswählen

Text$=Left(Text$,k)+C$+Right(Text$,Len(Text$)-k-Len(C$))
Quasi das Pondong (oder wie man dazu sagt) zu

Code: Alles auswählen

S$=Mid(String$,k,Len(C$))
Was ja den Textteil S$ an der Stelle k mit der Länge C$ ergibt.

Nun will ich genau umgekehrt einen String einfügen an einer bestimmten Stelle, aber ein InsertString(String$,Index,InsString$[,Mode])
gibbed ja nicht.

Wobei der Modus wäre: Überschreiben oder Einsetzen ...

Braucht man das zu selten?

Naja, vielleicht in PB 4.2 ? :D

Ich dachte, das benötigt man fast immer, wenn man eine kleine Schreibmaschine bastelt, oder einen Parser macht oder QuellText umwandeln will ...

:(

Bestimmt gibt es eine StringUserLib ... aber ist es nich ein so wichtiger Befehl, dass der zu PB dazu gehört???

In Pascal gab es DeleteString und InsertString
Mit Delete, konnte man an der Stelle Index eine Anzahl Zeichen entfernen aus dem String.

Das muss man bei PB immer mit Left + Right ...

In Pascal (gebe zu, dass es mit UnicodeUnterstützung schwierig ist)
war ein String ja eine Art Kette/Array von Zeichen

Mann konnte also S$[3] ausgeben bzw. setzen.
die Ausgabe würde Mid(S$,3,1) gleich kommen.

Cool wäre, wenn man das auch wie ein Dim machen könnte.

S$(3) ... oder so ähnlich :roll: :allright:


Code: Alles auswählen

Procedure.s InsertString(String$,Index,InsString$,Mode=1) ; 1=overwrite, 0=insert
;/ denkt an mich (Folker Linstedt)
  S$=Left(String$,Index)+InsString$
  
  If Mode
    S$+Right(String$,Len(String$)-Index-len(InsString$)) 
  Else
    S$+Right(String$,Len(String$)-Index) 
  EndIf  
  ProcedureReturn S$
EndProcedure
Fügt Zeichen ein, überschreibt auf Wunsch, entfernt Zeichen oder Kombination

Code: Alles auswählen

Procedure.s InsertString(String$,Index,InsString$,Mode=0) ; 0=insert, 1=overwrite, mode < 0 delete chars 
  
  Index-1 ; Zugefügt ...

  S$=Left(String$,Index) 
  
  If InsString$<>"" 
    S$+InsString$ 
  EndIf 
    
  If Mode=0 
    S$+Right(String$,Len(String$)-Index) 
  Elseif Mode=1 
    S$+Right(String$,Len(String$)-Index-len(InsString$)) 
  ElseIf Mode<0 
    S$+Right(String$,Len(String$)-Index+Mode-len(InsString$)) 
  EndIf  
  
  ProcedureReturn S$ 
EndProcedure 
:allright:
Zuletzt geändert von Xaby am 17.11.2007 11:04, insgesamt 2-mal geändert.
Kinder an die Macht http://scratch.mit.edu/
Little John

Re: ReplaceString Zeichen an Index-Stelle ...

Beitrag von Little John »

Xaby hat geschrieben:Braucht man das zu selten?
Nach meiner Erfahrung braucht man sowas schon öfter mal.
In "klassischen" BASIC-Versionen (z.B. QBasic) gibt es zusätzlich zur MID$()-Funktion auch einen MID$()-Befehl:

Code: Alles auswählen

Text$ = "Hand"
MID$(Text$, 2, 1) = "u"     --> Hund
MID$(Text$, 2, 3) = "ose"   --> Hose
Ich habe mich gewundert als ich feststellte, dass es diesen Befehl in PureBasic nicht gibt.

Gruß, Little John
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Beitrag von sibru »

Code: Alles auswählen

;Modul      StringChg Version 1.0 vom 01.07.2005
;
;Funktion:  einfügen/löschen von Zeichen in einen String
;
;Aufruf:    NewString$ = StringChg(OrgString$, InsPos, InsString$, DelChars) - einfügen/löschen von Zeichen in einen String
;           OldString$: der zu verändernde Basis-String
;           InsPos    : Position in OldString$, an der InsString eingefügt werden soll
;           InsString$: String, der an InsPos in OldString eingefügt werden soll
;           DelChars  : Anzahl zu überschreibener/löschener Zeichen beim Einfügen, 
;                       wenn kleiner 0, so wird Länge von InsString$ benutzt
;           
;           Diese Funktion liefert den veränderten OldString.
;           
;           Base$ = "123456789"
;           Print StringChange(Base$,4,"ABC",-1) --> "123ABC789"   ;DelChars<0: nur Austausch
;           Print StringChange(Base$,4,"ABC",1)  --> "123ABC56789" ;DelChars=1: 1 Zeichen (4) löschen
;           Print StringChange(Base$,4,"ABC",0)  --> "123ABC45789" ;DelChars=0: nix löschen
;
Procedure.s StringChg(InString$,InsPos,ChgString$,DelChars) ;Zeichen ab pos. Zeichem ersetzten
   If DelChars<0 : DelChars=Len(ChgString$) : EndIf
   ProcedureReturn Left(InString$,InsPos-1)+ChgString$+Mid(InString$,InsPos+1+DelChars,99999)
EndProcedure
viel Erfolg damit...

Siggi
Häns
Beiträge: 47
Registriert: 27.10.2007 14:30
Wohnort: Kölle

Beitrag von Häns »

Hallo Siggi,

danke für dein Code :allright:! Ich kann ihn für meinen Projekt gut gebrauchen.

Allerdings habe ich nicht das gleiche Ergebnis bekommen wie in deinem Beispiel. Es fehlte immer eine Zahl der Base$-Zahlenreihe. Erst nachdem ich von deinem Code

Code: Alles auswählen

 ProcedureReturn Left(InString$,InsPos-1)+ChgString$+Mid(InString$,InsPos+1+DelChars,99999)
die Zahl 1 nach dem Aufruf InsPos entfernt habe, waren alle Beispiele wieder korrekt:

Code: Alles auswählen

 ProcedureReturn Left(InString$,InsPos-1)+ChgString$+Mid(InString$,InsPos+DelChars,99999)
Gruß,
Häns
PB 5.6
Windows 7 Professional
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Code: Alles auswählen

;/ (c) Folker Linstedt
;/ 2007|11|16

Procedure.s InsertString(String$,Index,InsString$,Mode=0) ; 0=insert, 1=overwrite, mode < 0 delete chars
  
  Index-1  ; Behebt Positionsbug

  S$=Left(String$,Index)
  
  If InsString$<>""
    S$+InsString$
  EndIf
    
  If Mode=0
    S$+Right(String$,Len(String$)-Index) 
  Elseif Mode=1
    S$+Right(String$,Len(String$)-Index-len(InsString$)) 
  ElseIf Mode<0
    S$+Right(String$,Len(String$)-Index+Mode-len(InsString$)) 
  EndIf  
  
  ProcedureReturn S$
EndProcedure

debug InsertString("Hallo ihr da draußen",6,"",-4) ; entfernt "ihr "
debug InsertString("Hallo da draußen",6,"ihr ") ; fügt "ihr " ein
debug InsertString("Hallo ihr da draußen",6,"du",1) ; überschreibt "ih" mit "du"
debug InsertString("Hallo ihr da draußen",6,"du",-1) ; überschreibt "ih" mit "du" und entfernt das "r"
Kinder an die Macht http://scratch.mit.edu/
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Beitrag von sibru »

@Häns:

Danke für den Hinweis !!
Nu´ geht die Sucherei los... (wird in ´n paar Hundert Prg´s und .PBI´s benutzt, die (anscheinend) alle sauber fuktionieren...)

Siggi
Antworten