Voir si un caractère est dans une chaine

cs_Wayth Messages postés 3 Date d'inscription mercredi 8 juin 2011 Statut Membre Dernière intervention 11 juin 2011 - 8 juin 2011 à 22:31
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 - 15 juin 2011 à 12:52
Bonsoir,

Je viens sur votre forum car je n'arrive pas à trouver un label fonctionnel pour voir si un caractère se trouve ou non dans une chaîne de caractère saisie par l'utilisateur.

Voici mon bout de code pour l'instant :

debut: ;inclusion des donnees necessaire au programme
        mov ax,@data
        mov ds,ax
      
       
demande_mot:
    
        mov ax,03
        int 10h
        ;Affichage du message de demande de frappe
        mov ah,09h
        mov dx,offset mot
        int 21h       
        mov ah,0Ch
        mov al,0Ah
        mov dx,offset chaine
        int 21h         
 
        mov ah,09h
        lea dx,question 
        int 21h 
           
        mov ah,09h
        mov dx, offset caractere
        int 21h
        mov ah,01h
        int 21h     

        lea si,caractere
        jmp loop_for_every_char                
                           
yess:                                                                

        mov ah,09h
        mov dx,offset msgyes
        int 21h
        inc bx
        jmp loop_for_every_char         
            
        
loop_for_every_char:

        mov al, BYTE PTR [bx] 
        
        cmp al, caractere ;compare le caractère de la chaine avec le caractère saisie
        jz yess  ; si égal, renvoie au label yss

        inc bx                ; incrémente le pointeur
        cmp al, '$'        ; compare le caractère avec le caractère de fin de cha
        jz finish
        jnz loop_for_every_char



Quand je test avec le mot bonjour et la lettre o, cela me renvoie bien 2 fois que la caractère a été trouvé, mais ensuite cela boucle indéfiniment au label yess.

Help me

8 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
9 juin 2011 à 00:13
salut,

...
lea si,caractere

loop1:

mov al, BYTE PTR [bx]
inc bx
cmp al, '$'
jz finish
cmp al, caractere ;compare le caractère de la chaine
jnz loop1

mov ah,09h
mov dx,offset msgyes
int 21h
jmp loop_for_every_char

@++
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
9 juin 2011 à 00:16
mettre "jmp loop1" à la fin loop_for_every_char n'existant plus
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
9 juin 2011 à 00:22
re,

Ton code n'est pas très beau mais je n'y vois pas d'erreur. Ce qui me fait dire que la fonction dos d'entrée standard ne met pas de caractère '$' en fin de saisie, tu devras le rajouter ou verifier avec le caractère CR (carriage return). A verifier.

@++
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
9 juin 2011 à 00:38
une solution simple consisterait a initialiser le buffer avec des '$'

chaine db SAISIE_MAX dup('$')
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Wayth Messages postés 3 Date d'inscription mercredi 8 juin 2011 Statut Membre Dernière intervention 11 juin 2011
9 juin 2011 à 12:03
Bonjour,

Merci pour ces réponses :)

Par contre en remplaçant mes labels de comparaison par le tiens, quand je lance le programme, il ne me renvoie jamais un message comme quoi il trouve un caractère commum. Il boucle puis me renvoie le label finish.

Je ne sais pas d'où peut venir le soucis (j'ai bien initialisé le buffer avec des '$')
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
9 juin 2011 à 22:30
re,

Ne fais pas un copié collé car j'ai supposé que ton code n'étais pas entier. Tu initialises "si" mais il n'est jamais utilisé. De même, "bx" n'est pas initialisé mais utilisé.

@++
0
cs_Wayth Messages postés 3 Date d'inscription mercredi 8 juin 2011 Statut Membre Dernière intervention 11 juin 2011
11 juin 2011 à 21:16
Bonsoir,

Je reviens car malgré différentes modifications que j'ai pu faire grave à tes conseils, mon programme ne fonctionne toujours pas :s

Je remet ce que j'avais au début :

name "comparaison"

org 100h ;initialisation

           
        .DATA 
         

      mot db 10,13,"Entrer votre mot  :  ", '$' 
      
 mot_tape db 10,13,10,13,"Vous avez tapee  :  ", '$'
 
   chaine db 30 dup ('$') 
   
 question db 10,13,10,13,10,13,"Quel caractere souhaitez-vous rechercher  ?  ", '$'
       
caractere db 30 dup ('$')       
       
     char db ?  ;declaration du caractere         
       
   msgyes db 10,13,"Caractere trouve", '$'    
                                            
      fin db 10,13,"Merci d'avoir joue", '$'                                      
                                            
                  
          int 10h
                             
         .CODE
         .8086   
                                

debut: ;inclusion des donnees necessaire au programme
        mov ax,@data
        mov ds,ax
      
       
demande_mot:
    
        mov ax,03
        int 10h
        ;Affichage du message de demande de frappe
        mov ah,09h
        mov dx,offset mot
        int 21h
        ;Effacement du buffer et du saisi clavier
        mov ah,0Ch
        ;Saisie au clavier d'une chaine
        mov al,0Ah
        ;buffer ou sera placé la chaine
        mov dx,offset chaine
        int 21h         
               
        mov ah,09h
        lea dx,question 
        int 21h 
           
        mov ah,09h
        mov dx, offset caractere
        int 21h
        mov ah,01h
        int 21h                                                      
        jmp loop_for_every_char                
                           
yess:                                                                

        mov ah,09h
        mov dx,offset msgyes
        int 21h
        inc bx
        jmp loop_for_every_char         
                    
loop_for_every_char:

        mov al, BYTE PTR [bx]  ;al contient le caractere pointe par la bx 
        

        cmp al, caractere
        jz yess

        inc bx                ; incrémente le pointeur pour se préparer à lire le suivant
        cmp al, '$'        ; compare le caractère avec le caractère de fin de chaine
        jz finish
        jnz loop_for_every_char ; si ce n'est pas la fin, on recommence
                                          
finish:

        mov dx, offset fin
        mov ah,09h
        int 21h
        mov ah,01h
        int 21h                                                                                          

stop: ret  ; stop


Encore merci :)
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
15 juin 2011 à 12:52
re,

Je ne vois toujours pas l'initialisation de bx.

@++
0
Rejoignez-nous