Voir si un caractère est dans une chaine

Signaler
Messages postés
3
Date d'inscription
mercredi 8 juin 2011
Statut
Membre
Dernière intervention
11 juin 2011
-
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
-
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

Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
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

@++
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
mettre "jmp loop1" à la fin loop_for_every_char n'existant plus
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
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.

@++
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
une solution simple consisterait a initialiser le buffer avec des '$'

chaine db SAISIE_MAX dup('$')
Messages postés
3
Date d'inscription
mercredi 8 juin 2011
Statut
Membre
Dernière intervention
11 juin 2011

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 '$')
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
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é.

@++
Messages postés
3
Date d'inscription
mercredi 8 juin 2011
Statut
Membre
Dernière intervention
11 juin 2011

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 :)
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
re,

Je ne vois toujours pas l'initialisation de bx.

@++