Newsgroup: it.comp.lang.visual-basic
Titolo: Scambio di caratteri

Vi ringrazio del precedente aiuto, però adesso ho un'altro problema: come si
fa a sostituire un carattere con il suo successivo, con il secondo e con il
terzo (es. la A con la B, oppure la A con la C, la A con la D)?
--
"Noi siamo i Borg, abbassate i vostri scudi e arrendetevi. Assimileremo le
vostre peculiarità biologiche e tecnologiche alle nostre, la vostra cultura
si adatterà a servire noi. La resistenza è inutile!"

Prova a vederti la Funz. REPLACE
Ciao SIMO
--
__________________
www.sasim.cjb.net


terzo (es. la A con la B, oppure la A con la C, la A con la D)?
Non so se ho capito cosa vuoi, prova un po' questo:
Public Sub Test()
    Dim src As String, tmp As String    
    src = "abcdef"
    ' salva il 1° carattere per dopo
    tmp = Mid$(src, 1, 1)
    ' sostituisce il 1° con il 3° carattere
    Mid(src, 1, 1) = Mid$(src, 3, 1)
    ' mette al 3° posto il carattere che era al 1°
    Mid(src, 3, 1) = tmp    
    Debug.Print src
End Sub
hth, hal
p.s.
se possibile, cambia nick ...

 se possibile, cambia nick ...
Purtroppo credo che non sia possibile, sai io sono di un'altro NG, e per me
è indispensabile che loro mi conoscano con questo nome (precisamente io
vengo da it.fan.startrek)


     ' salva il 1° carattere per dopo
Cosa intendi per "salva il carattere per dopo"?


 oppure la A con la C, la A con la D)?
toh! il famoso algoritmo ROT!
non ne ho mai scritto un'implementazione prima, proviamo:
**************************************************
Option Explicit
Const vbCharSize = 2
Const vbCharNull = 0
Const vbCharA = 65
Const vbCharZ = 90
Const vbCharLowA = 97
Const vbCharLowZ = 122
Const vbAlphabetLength = 26
Sub InPlaceDirtyRot( _
  ByVal Str As Long, _
  ByVal By As Long, _
  ByVal Length As Long, _
  ByVal CharSize As Long _
)
  Dim chrCur As Long
  Dim i As Long
  Dim flgZeroTerm As Boolean
  If Length < 0 Then
    Do
      GoSub innerLoop
    Loop Until chrCur = vbCharNull
  Else
    For i = 1 To Length
      GoSub innerLoop
    Next i
  End If
  Exit Sub
innerLoop:
CopyMemory chrCur, ByVal Str, CharSize
If chrCur >= vbCharLowA And chrCur <= vbCharLowZ Then
  CopyMemory _
    ByVal Str, _
    (chrCur - vbCharLowA + By) Mod vbAlphabetLength + vbCharLowA, _
    CharSize
 
ElseIf chrCur >= vbCharA And chrCur <= vbCharZ Then
  CopyMemory _
    ByVal Str, _
    (chrCur - vbCharA + By) Mod vbAlphabetLength + vbCharA, _
    CharSize
End If
Let Str = Str + CharSize
Return
End Sub
Sub InPlaceCleanRot( _
  ByVal Str As String, _
  ByVal By As Long, _
  ByVal Length As Long _
)
  Dim chrCur As Long
  Dim i As Long
  For i = 1 To Length
    Let chrCur = Asc(Mid(Str, i, 1))
    If chrCur >= vbCharLowA And chrCur <= vbCharLowZ Then
      Mid(Str, i, 1) = _
      Chr((chrCur - vbCharLowA + By) Mod vbAlphabetLength + vbCharLowA)
 
    ElseIf chrCur >= vbCharA And chrCur <= vbCharZ Then
      Mid(Str, i, 1) = _
      Chr((chrCur - vbCharA + By) Mod vbAlphabetLength + vbCharA)
 
    End If
  Next i
End Sub
Function DirtyRot(Str As String, ByVal By As Long) As String
  Dim strOutStr As String
  Dim intInLen As Long
  Let intInLen = Len(Str)
  If intInLen = 0 Then: Exit Function
  Let strOutStr = Space(intInLen)
  InPlaceDirtyRot StrPtr(strOutStr), By, intInLen, vbCharSize
  DirtyRot = strOutStr
End Function
Function CleanRot(Str As String, ByVal By As Long) As String
  Dim strOutStr As String
  Dim intInLen As Long
  Let intInLen = Len(Str)
  If intInLen = 0 Then: Exit Function
  Let strOutStr = Space(intInLen)
  InPlaceCleanRot strOutStr, By, intInLen
  CleanRot = strOutStr
End Function
**************************************************
esempio d'uso:
Let myString = CleanRot("ABC", 1)
myString sarà uguale a "BCD"
Let myString = CleanRot("BCADOZ", 3)
myString sarà uguale a "EFDGRC" (perchè i caratteri, arrivati alla fine, 
"ruotano" e tornano all'inizio)
Magari non è esattissimamente quello che hai chiesto (essere più chiaro 
no? ;P), ma là dentro c'è anche come farlo per ogni singolo carattere, 
cerca di scoprire dove :)
NOTE:
CleanRot() è la versione "pulita", usa solo funzioni "legittime", e 
soprattutto funziona, e può funzionare su qualsiasi versione di VB. 
DirtyRot() è la versione "sporca", fa uso dei puntatori, fa un sacco di 
assunzioni riguardo alle dimensioni dei caratteri di una stringa, usa il 
famigerato costrutto (VI PREGO, voi NON usatelo) GoSub... Return (ma se 
guardate bene la funzione vedrete che non avevo scelta), ma è circa il 
doppio più veloce della versione "pulita"
Per entrambe le funzioni è presente una Sub corrispondente, che esegue 
l'algoritmo "sul posto", ossia modificando direttamente il buffer 
passato alla funzione. Le due Sub, inoltre, permettono al chiamante di 
specificare anche il numero di caratteri della stringa e (questo solo 
nel caso di DirtyRot) le dimensioni di ogni carattere (o un numero 
negativo, in tal caso la funzione si fermerà quando incontrerà un 
carattere di fine stringa). Sono particolarmente utili per modificare 
buffer esterni senza doverne fare delle copie
Sto per spedire al Sito Comune un esempio di come fare il ROT13 (ad 
esempio, ma voglio anche inserire funzioni come uppercase, lowercase e 
reverse) del testo selezionato in una TextBox (o di tutta la textbox nel 
caso non fosse selezionato nulla), senza usare alcun buffer di 
"scratch" ma modificando direttamente quello che la TextBox usa 
internamente, per dimostrare questo punto, per mostrare com'è facile 
infilare i "ferri da lavoro" nella "pancia" di una TextBox, e 
soprattutto per insegnare come "giostrarsi" con le stringhe senza 
passare per la lumacosa runtime. Giusto il tempo di aggiungere qualche 
test dei parametri qua e là (si lavora direttamente con i puntatori, non 
c'è da scherzarci. Su Windows 95/98/ME si rischia il BSOD, mica bisi), 
di testarlo su Windows 98 e lo mando
Uh, entità superiore, dimenticavo, per la declare di CopyMemory 
procurati la type library per l'API Win32, ora l'indirizzo non ce l'ho, 
ma cercando "Win32 API type library" la trovi di sicuro
PS: è normale metterci due dannate ore e mezza su una funzione così 
banale? stanno per liquefarmisi gli occhi =____=

 Non so se ho capito cosa vuoi, prova un po' questo:
a me era parso di capire che volesse solo sostituire ogni carattere con
quello che lo segue in ordina alfabetico. Pratica che applicata al tuo
nick... Odissea docet ;)
Silv:o)

incontrerà un carattere di fine stringa).
la parentesi m'è scivolata giù. Correzione: "Le due Sub, inoltre, 
permettono al chiamante di specificare anche il numero di caratteri 
della stringa (nel caso di DirtyRot, anche un numero negativo, in tal 
caso la funzione si fermerà quando incontrerà un carattere di fine 
stringa) e (questo sempre solo nel caso di DirtyRot) le dimensioni di 
ogni carattere"