Comparer deux chaines de texte [ Résolu]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
tmo
Messages : 5
Inscription : jeu. 08/mars/2007 14:34

Comparer deux chaines de texte [ Résolu]

Message 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
Dernière modification par tmo le sam. 17/mars/2007 14:37, modifié 2 fois.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message 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 <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

...
Dernière modification par Backup le mar. 19/août/2014 14:51, modifié 1 fois.
tmo
Messages : 5
Inscription : jeu. 08/mars/2007 14:34

Message par tmo »

Merci à tous
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

....
Dernière modification par Backup le mar. 19/août/2014 14:51, modifié 1 fois.
Stefou
Messages : 234
Inscription : jeu. 18/janv./2007 14:08

Message 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 )
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

....
Dernière modification par Backup le mar. 19/août/2014 14:52, modifié 1 fois.
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message 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%
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message 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
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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.
Dernière modification par lionel_om le jeu. 15/mars/2007 8:01, modifié 1 fois.
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Re: Comparer deux chaines de texte

Message 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
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

c'est le concours de celui qui plombera les ventes de PB ?

Dri :lol:
Stefou
Messages : 234
Inscription : jeu. 18/janv./2007 14:08

Message par Stefou »

Ca fait plaisir de voir que l'on peut encore mettre le bordel dans un topic :lol: :lol: :lol:
tmo
Messages : 5
Inscription : jeu. 08/mars/2007 14:34

Message 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
:)
Répondre