Seite 1 von 1

ReplaceString Zeichen an Index-Stelle ...

Verfasst: 16.11.2007 01:53
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:

Re: ReplaceString Zeichen an Index-Stelle ...

Verfasst: 16.11.2007 12:28
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

Verfasst: 16.11.2007 14:58
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

Verfasst: 16.11.2007 19:13
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

Verfasst: 16.11.2007 19:52
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"

Verfasst: 17.11.2007 12:30
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