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

Publié : sam. 10/mars/2007 15:27
par Backup
....
Publié : dim. 11/mars/2007 9:10
par Stefou
@ Dobro

A prendre pour de rire
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 !
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
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
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

Publié : lun. 12/mars/2007 19:36
par Stefou
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
