Comparer deux chaines de texte [ Résolu]
Comparer deux chaines de texte [ Résolu]
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
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.
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
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 <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<
-
- Messages : 1500
- Inscription : jeu. 25/mars/2004 11:23
- Localisation : Sophia Antipolis (Nice)
- Contact :
Je suis pas du tout daccord avec toi DoBro. Pour que les 2 chaînes soient dîtes égales avec FindString(), il faut que :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 <<<<< ; <<<<<<<<<<<<<<<<<<<<<<<<<<
* 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

Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Participez à son extension: ajouter vos programmes et partagez vos codes !
@ Dobro
A prendre pour de rire
T'es quand même fort en optimisation tu remplace :
Hihihihihih !
(Stefou : anciennement Olivier qui t'avait proposé de venir enregistrer chez lui )


T'es quand même fort en optimisation tu remplace :
ParIf Chaine1 = Chaine2
Et en plus tu persiste !a= Len (Chaine1.s )
b= Len (Chaine2.s)
Position = FindString (Chaine1.s,Chaine2.s, 1)
If Position =0 Or a<>b

Hihihihihih !
(Stefou : anciennement Olivier qui t'avait proposé de venir enregistrer chez lui )
Bonjour à tous !
Je viens ici mettre mon grain de sel
Je vous propose mon code pour mettre un peu d'ambiance !!
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%
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)
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%
je rajoute mon boulet.
j ai fait un truc de recherche de chaine pour mon projet.
mais en asm.
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
-
- Messages : 1500
- Inscription : jeu. 25/mars/2004 11:23
- Localisation : Sophia Antipolis (Nice)
- Contact :
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 :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)
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
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.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 !! [...]
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 !
Participez à son extension: ajouter vos programmes et partagez vos codes !
Re: Comparer deux chaines de texte
Un exemple d'utilisation de CompareMemoryString() :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
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
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

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
