Page 1 sur 2

Comparer deux chaines de texte [ Résolu]

Publié : jeu. 08/mars/2007 18:09
par tmo
Je débute totalement...
je cherche à savoir si mon texte "chaine1" et strictement égale à mon texte "chaine2"

Comment faire ?
Il me semble que la fonction "CompareMemoryString" , si j'ai bien compris l'aide, remplisse ce rôle mais j'ai quelques difficultées à l'utiliser
Des exemples simples me seraient utiles
Merci

Publié : jeu. 08/mars/2007 18:22
par Guimauve
Bonjour à toi et bienvenu dans le monde PureBasic.

Pour comparer les chaines de caractère de façon simple on utilise les mêmes test que pour les nombres. ("=". "<", ">", "<>"). À noter que ces test sont sensible à la casse. Ce qui veut dire que "a" est différent de "A".

Fait quelque test avec le code suivant.

A+
Guimauve

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Nom du projet : Comparer 2 chaines de caractères
; Fichier : Démonstration
; Version : 1.0.0
; Programmation : OK
; Programmé par : Guimauve
; Date : 08-03-2007
; Mise à jour : 08-03-2007
; Codé avec PureBasic V4.02
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Chaine1.s = "Allo le monde"
Chaine2.s = "Allo le monde"

If Chaine1 = Chaine2
   Debug "Les chaines sont identique"
   
ElseIf Chaine1 > Chaine2
   Debug "La Chaine 2 vient avant la chaine 1 dans l'ordre alphabétique"
   
ElseIf Chaine1 < Chaine2
   Debug "La Chaine 1 vient avant la chaine 2 dans l'ordre alphabétique"
   
EndIf

; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<

Publié : ven. 09/mars/2007 13:11
par Backup
...

Publié : sam. 10/mars/2007 2:27
par tmo
Merci à tous

Publié : sam. 10/mars/2007 14:56
par lionel_om
Dobro a écrit :tu peux faire ça aussi
(test juste si la chaines 2 est pareilles ou differentes de la chaine 1 de reference)

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Nom du projet : Comparer 2 chaines de caractères
; Fichier : Démonstration
; Version : 2.0.0
; Programmation : OK
; Programmé par : Dobro
; Date : 08-03-2007
; Mise à jour : 08-03-2007
; Codé avec PureBasic V4.02
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Chaine1.s = "Allo le monde"
Chaine2.s = "Allo le monde"

Position = FindString(Chaine1.s,Chaine2.s, 1) 

If Position =0
    Debug "Les chaines sont Diferentes" 
Else
     Debug "Les chaines sont pareilles" 
EndIf

; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<
Je suis pas du tout daccord avec toi DoBro. Pour que les 2 chaînes soient dîtes égales avec FindString(), il faut que :
* Position = 1
* Len(Chaine1) = Len(Chaine2)

Car si Position <> 1, les 2 chaînes ne sont pas égales.
Ensuite si Position = 1, mais que Chaine1 est plus grand que Chaine2 (début de Ch1 et Ch2 identique, mais Ch1 a des lettres en plus à la fin), ca va encore marcher. Donc faut aussi comparer la longueur...

Lio :wink:

Publié : sam. 10/mars/2007 15:27
par Backup
....

Publié : dim. 11/mars/2007 9:10
par Stefou
@ Dobro

:D A prendre pour de rire :D

T'es quand même fort en optimisation tu remplace :
If Chaine1 = Chaine2
Par
a= Len (Chaine1.s )
b= Len (Chaine2.s)
Position = FindString (Chaine1.s,Chaine2.s, 1)

If Position =0 Or a<>b
Et en plus tu persiste ! 8O

Hihihihihih !

(Stefou : anciennement Olivier qui t'avait proposé de venir enregistrer chez lui )

Publié : dim. 11/mars/2007 22:55
par Backup
....

Publié : lun. 12/mars/2007 10:41
par brossden
Bonjour à tous !

Je viens ici mettre mon grain de sel :lol:

Je vous propose mon code pour mettre un peu d'ambiance !!

Code : Tout sélectionner

Chaine1.s="Allo le monde1"
Chaine2.s="Allo le monde "
Resultat.s = "sont identiques"
If Len(Chaine1)<>Len(Chaine2)
  Resultat = "n'ont pas le même nombre de caractères"
Else
  Debug "ok"
  For n = 1 To Len(Chaine1)
    If PeekC(@Chaine1+n-1)<>PeekC(@Chaine2+n-1)
      Resultat = "sont différentes"
    EndIf
  Next
EndIf
MessageRequester("Comparaison des deux chaines", "Les deux chaines "+Resultat)
Il est à noter que c'est le seul code qui permette de vérifier que deux chaines sont rigoureusement identiques, si elles comprennent des valeurs Ascii autre que Alphanumérique et mis à part :

For n = 1 To Len(Chaine1) qu'il faudra remplacer par une autre source pour connaitre la longueur de la chaine (exemple buffer de modem), ce code est le seul proposé qui rempli la fonction à 100%

Publié : lun. 12/mars/2007 13:39
par tonton
je rajoute mon boulet.
j ai fait un truc de recherche de chaine pour mon projet.
mais en asm.

Code : Tout sélectionner


chaine1.s="j'ai la burne gauche qui me gratte!" 
chaine2.s="j'ai la burne droite qui me gratte!" 

chai1=@chaine1.s
chai2=@chaine2.s
nb_trouvchai=0



!call cherch_car


Debug  nb_trouvchai

End







;----- recherche une chaine de carractere ----------------
!cherch_car:
  !pushad
  !mov     edi,[v_chai2] ;adresse de la chaine a chercher
  !mov     esi,[v_chai1] ;adresse du texte a traiter
  !mov     dword[v_nb_trouvchai],0 ;nombre de foix trouvé (0 sinon)
  !mov     dword[ad_trouvchai],0 ;adresse debut de la derniere chaine trouvée
  !mov     dword[adf_trouvchai],esi ;adresse fin de la derniere chaine trouvée
 ; !mov     dword[compt_chai],0; 1:comptage      0:arret au premier 
  !mov     dword[etat_cherche],1
  !mov     edx,edi
  !mov     ebp,0
  !mov     al,byte[edi]
  !cmp     al,0
  !je      fin_cherch03 
!cherch_02: 
  !mov     bl,byte[esi]
  !cmp     bl,0
  !je      fin_cherch02
  !cmp     bl,al
  !je      ok_trouv
  !add     al,32
  !cmp     bl,al
  !je      ok_trouv
  !sub     al,32
  !add     bl,32
  !cmp     bl,al
  !je      ok_trouv
  !cmp     ebp,0
  !jne     pas_esi
  !add     esi,1
!pas_esi:  
  !mov     ebp,0
  !mov     edi,edx
  !mov     al,byte[edi]
  !jmp     cherch_02

!ok_trouv:
  !add     ebp,1 
  !add     edi,1 
  !add     esi,1
  !mov     al,byte[edi]
  !cmp     al,0
  !je      fin_cherch_trouv01
  !mov     bl,byte[esi]
  !cmp     bl,0
  !je      fin_cherch02
  !jmp     cherch_02

!fin_cherch01:  
  !popad
  !ret
!fin_cherch02: 
  !mov     dword[etat_cherche],0 
  !popad
  !ret
!fin_cherch03:  
  !mov     dword[v_nb_trouvchai],-1 
  !popad
  !ret  
!fin_cherch_trouv01: 
  !mov     edi,edx
  !mov     ebp,0
  !mov     al,byte[edi]
  !add     dword[v_nb_trouvchai],1 
  !cmp     dword[compt_chai],1
  !je      cherch_02
  !mov     dword[adf_trouvchai],esi
  !sub     esi,ebp
  !mov     dword[ad_trouvchai],esi
  !popad
  !ret  
  
   !section '.data' align 16
!ad_cherchai:
 !dd  0
 !ad_txtcher:
 !dd  0
 !nb_trouvchai:
 !dd  0
 !ad_trouvchai:
 !dd  0
 !compt_chai:
 !dd  0
 !etat_cherche:
 !dd  0
  !nb_carcher:
 !dd  0
   !adf_trouvchai:
 !dd  0

Publié : lun. 12/mars/2007 16:28
par lionel_om
brossden a écrit :Bonjour à tous !

Je viens ici mettre mon grain de sel :lol:

Je vous propose mon code pour mettre un peu d'ambiance !!

Code : Tout sélectionner

Chaine1.s="Allo le monde1"
Chaine2.s="Allo le monde "
Resultat.s = "sont identiques"
If Len(Chaine1)<>Len(Chaine2)
  Resultat = "n'ont pas le même nombre de caractères"
Else
  Debug "ok"
  For n = 1 To Len(Chaine1)
    If PeekC(@Chaine1+n-1)<>PeekC(@Chaine2+n-1)
      Resultat = "sont différentes"
    EndIf
  Next
EndIf
MessageRequester("Comparaison des deux chaines", "Les deux chaines "+Resultat)
Pour optimiser tu peux avoir un pointeur de chaîne et déplacer le ponteur à chaque itération dans la boucle et donc comparer les caractères ASCII de chaque lettre :

Code : Tout sélectionner

; esquisse de code, donc non compilée
*ptr1.b = @Chaine1
*ptr2.b = @Chaine2
While *ptr1 = *ptr2 And *ptr1>0 And *ptr2>0
  *ptr1 + 1
  *ptr2 + 1
Wend
DoBro a écrit : (test juste si la chaines 2 est pareilles ou differentes de la chaine 1 de reference)


bref tu ne touche pas a la chaine 1 !! qui est le Model

tu verra que meme si tu ajoute des caracteres a la chaine 2 ça va te dire que c'est different !!

que tu ajoute ces caracteres au debut ou a la fin !! [...]
Je ne comprend pas tout ce que tu me dis. Qd tu compare deux chaînes, ca marche dans les 2 sens, je ne comprend pas ton "modèle". Mais c'est vrai que qd on se base sur le nombre de carctères, on se moque de savoir si la position de FindString() renvoie qqchose de supérieur à 1 ou pas.

Re: Comparer deux chaines de texte

Publié : lun. 12/mars/2007 17:24
par gnozal
tmo a écrit :Je débute totalement...
je cherche à savoir si mon texte "chaine1" et strictement égale à mon texte "chaine2"

Comment faire ?
Il me semble que la fonction "CompareMemoryString" , si j'ai bien compris l'aide, remplisse ce rôle mais j'ai quelques difficultées à l'utiliser
Des exemples simples me seraient utiles
Merci
Un exemple d'utilisation de CompareMemoryString() :

Code : Tout sélectionner

Chaine1.s = "A"
Chaine2.s = "B"
Comparaison.l = CompareMemoryString(@Chaine1, @Chaine2, 0)
Select Comparaison
  Case 0
    Debug "Les 2 chaînes sont identiques"
  Case 1
    Debug "Chaîne 1 > Chaîne 2"
  Case -1
    Debug "Chaîne 2 > Chaîne 1"
EndSelect

Publié : lun. 12/mars/2007 17:57
par Dr. Dri
c'est le concours de celui qui plombera les ventes de PB ?

Dri :lol:

Publié : lun. 12/mars/2007 19:36
par Stefou
Ca fait plaisir de voir que l'on peut encore mettre le bordel dans un topic :lol: :lol: :lol:

Publié : lun. 12/mars/2007 22:06
par tmo
Wahou...
J'en demandais pas tant...
mais j'ai tout ce dont j'avais besoin
Re merci
( en peu de temps et sans exprience dans la programmation on arrive quelque chose de vraiment bien)

Maintenant que je sais comparer deux chaines ( avec plusieures méthodes...) Mon probléme se complique un peu...
Je posséde deux fichiers texte, source.txt et averifier.txt qui sont les resultats d'extraction de données d'une base SQL.
je voudrais tester si la ligne 1 de mon fichier source correspond à la ligne 1 de mon fichier a verifier, idem pour la ligne deux.. jusqu'à EoF
:)