Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1625 connectés 

  FORUM HardWare.fr
  Programmation
  ASM

  supprimer des voyelles dans une chaine de caracteres

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

supprimer des voyelles dans une chaine de caracteres

n°2297238
bjs
Posté le 05-03-2017 à 19:22:26  profilanswer
 

Bonjour,
 
le code que j'ai ecrit supprime(ou plutot fait un mov du caractère qui se trouve dans la case avant la voyelle dans la case où est la voyelle) et ç'est pas ça ce que je voulais faire. Je voudrais trouver les voyelles dans ma chaine et les supprimer sans rien mettre à la place... peut être en reduisant la taille de la chaine de caractères ???
la graine de poivre doit devenir l grn d pvr
 

Code :
  1. #include <time.h>
  2. #include <stdlib.h>
  3. #define TAILLE_VECTEUR 15
  4. char chaine[TAILLE_VECTEUR]="La graine de poivre";
  5. int i;
  6. void main()
  7. {
  8. i=0;
  9. _asm
  10. {
  11. dwhile:
  12.  mov edi,i
  13.  cmp i, TAILLE_VECTEUR
  14.     je  fin_bcl
  15.  cmp chaine[edi],'a'
  16.  je fwhilefin
  17.  cmp chaine[edi],'e'
  18.  je fwhilefin
  19.  cmp chaine[edi],'i'
  20.  je fwhilefin
  21.  cmp chaine[edi],'o'
  22.  je fwhilefin
  23.  cmp chaine[edi],'u'
  24.  je fwhilefin
  25.  inc i
  26.  jmp dwhile
  27. fwhilefin:
  28. mov cl,chaine[edi-1]
  29. mov chaine[edi],cl
  30. inc i
  31. mov eax,TAILLE_VECTEUR
  32. sub eax,1
  33. jmp dwhile
  34. fin_bcl:
  35. }
  36. }

mood
Publicité
Posté le 05-03-2017 à 19:22:26  profilanswer
 

n°2297241
gzii
court-circuit
Posté le 05-03-2017 à 21:59:28  profilanswer
 

Salut. Plusieurs choses. Tu sembles dimensionner ta chaîne à 15 mais ce que tu mets dedans est plus long.
Ensuite c'est quoi qui indique la fin de ta chaine ? Un octet à zéro ?
Et puis sans connaître cet assembleur on a l'impression qu'en ligne 34 tu copies le caractère précédent dans cl et en 35 cl dans le caractère courant.
Si tu voulais supprimer le caractère c'est tout ce qui suit qu'il faudrait mettre dans le caractère précédent jusqu'au zéro final.

n°2297244
bjs
Posté le 05-03-2017 à 22:22:06  profilanswer
 

bonjour merci pour ton aide. ça marche maintenant ça fait L grand zorro mais quand ça revient dans le dwhile le i a changé ou le edi a changé et ça tourne en boucle et je sais pas où il est. mais bon ç'est un bon début car j'ai compris que je dois faire un décalage vers la gauche de tous les elements après avoir trouvé la voyelle...
 

Code :
  1. #include <time.h>
  2. #include <stdlib.h>
  3. #define TAILLE_VECTEUR 15
  4. char chaine[TAILLE_VECTEUR]="Le grand zorro";
  5. int i=0;
  6. void main()
  7. {
  8. i=0;
  9. _asm
  10. {
  11. dwhile:
  12.  mov edi,i
  13.  cmp edi, TAILLE_VECTEUR
  14.     je  fin_bcl
  15.  cmp chaine[edi],'a'
  16.  je fwhilefin
  17.  cmp chaine[edi],'e'
  18.  je fwhilefin
  19.  cmp chaine[edi],'i'
  20.  je fwhilefin
  21.  cmp chaine[edi],'o'
  22.  je fwhilefin
  23.  cmp chaine[edi],'u'
  24.  je fwhilefin
  25.  inc i
  26.  jmp dwhile
  27. fwhilefin:
  28. mov cl,chaine[edi+1]
  29. mov chaine[edi],cl
  30. inc i
  31. mov edi,i
  32.  
  33. cmp chaine[edi],0
  34. je dwhile
  35. jmp fwhilefin
  36. fin_bcl:
  37. }
  38. }

n°2297246
bjs
Posté le 05-03-2017 à 22:27:09  profilanswer
 

voilà j'ai rajouté un branchement pour remettre le i à 0 et repasser dans la boucle dwhile  
ça marche maintenant j'ai vu au débogueur
mais je dois faire un dernier truc pour qu'il sort de la boucle au cas où il trouve le caractère zero ou bien quand tout est fini ... je peux faire comment car au débugeur ça continue à boucler même quand toutes les voyelles ont disparu et que la chaine s'est bien decalée?? ou bien comment réduire la taille de mon vecteur ??? parce que au debogueur y a plusieurs 0 à la fin de la chaine (en fonction du nombre de voyelles que j'ai supprimé ? je suppose)
 

Code :
  1. #include <time.h>
  2. #include <stdlib.h>
  3. #define TAILLE_VECTEUR 15
  4. char chaine[TAILLE_VECTEUR]="Le grand zorro";
  5. int i=0;
  6. void main()
  7. {
  8. i=0;
  9. _asm
  10. {
  11. dwhile:
  12.  mov edi,i
  13.  cmp edi, TAILLE_VECTEUR
  14.     je  fin_bcl
  15.  cmp chaine[edi],'a'
  16.  je fwhilefin
  17.  cmp chaine[edi],'e'
  18.  je fwhilefin
  19.  cmp chaine[edi],'i'
  20.  je fwhilefin
  21.  cmp chaine[edi],'o'
  22.  je fwhilefin
  23.  cmp chaine[edi],'u'
  24.  je fwhilefin
  25.  inc i
  26.  jmp dwhile
  27. fwhilefin:
  28. mov cl,chaine[edi+1]
  29. mov chaine[edi],cl
  30. inc i
  31. mov edi,i
  32.  
  33. cmp chaine[edi],0
  34. je dwhile2
  35. jmp fwhilefin
  36. dwhile2:
  37. mov i,0
  38. jmp dwhile
  39. fin_bcl:
  40. }
  41. }


Message édité par bjs le 05-03-2017 à 22:52:32
n°2297265
gzii
court-circuit
Posté le 06-03-2017 à 09:23:55  profilanswer
 

Normalement au premier trouvé lors du parcours, ça doit s'arrêter.
Une autre solution aurait été de copier les caractères un à un vers une nouvelle chaîne sauf les voyelles, sans doute plus facile.
Je ne vois pas de jump sur fin_bcl dans le cas d'un zéro
(je peux me tromper, l'assembleur j'en faisais dans les années 80 sur processeurs 6502/6510 donc je ne connais pas trop tes mnémoniques et je survole le code plus que je ne le lis)


Message édité par gzii le 06-03-2017 à 09:26:58
n°2297267
gzii
court-circuit
Posté le 06-03-2017 à 09:29:26  profilanswer
 

Ça fait quoi mov i,0, tu mets 0 dans i ? Donc tu recommences ta boucle au début ?

n°2297272
h3bus
Troll Inside
Posté le 06-03-2017 à 10:14:41  profilanswer
 

Une meilleure solution: avoir 2 index sur la chaîne de caractère, source et destination.
 
On démarre avec:
source = destination = premier caractère de chaine
 
Boucle tant que @source est non null
    Si le caractère @source n'est pas une voyelle, on copie @source dans @destination et on incrémente destination
    Dans tous les cas on incrémente @source
Fin de boucle


Message édité par h3bus le 06-03-2017 à 10:18:19

---------------
sheep++
n°2297308
gzii
court-circuit
Posté le 06-03-2017 à 16:58:48  profilanswer
 

Ha ben voilà, c'est plus propre. :)

n°2297358
h3bus
Troll Inside
Posté le 07-03-2017 à 15:27:44  profilanswer
 

J'ai pas testé:

Code :
  1. #define TAILLE_VECTEUR 15
  2. char chaine[TAILLE_VECTEUR]="Le grand zorro";
  3. const char voyelles[]="aeiouy"; // Liste des voyelles
  4. void main()
  5. {
  6.     _asm
  7.     {
  8.         mov     esi, chaine             // esi => source
  9.         mov     edi, chaine             // edi => destination
  10.         dwhile:
  11.             mov     al, [esi]           // On recupère le caractère @source
  12.             test    al, al              // @source == '\0'
  13.             jz      end_while
  14.             push    esi                 // Sauvegarde source sur le stack
  15.             mov     esi, voyelles       // esi => voyelle courante
  16.             boucle_voyelles:
  17.                 mov     bl, [esi]       // On recupère le caractère @voyelle
  18.                 test    bl, bl          // @voyelle == '\0' (fin de chaine voyelles)
  19.                 jz      pas_voyelles
  20.                 cmp     bl, al          // @voyelle == @source
  21.                 je      voyelle
  22.                 inc     esi             // voyelle suivante
  23.                 jmp     boucle_voyelles // Loop voyelles
  24.         pas_voyelles:
  25.             mov     [edi], al           // Copie @source dans @destination
  26.             inc     edi                 // destination++
  27.         voyelle:
  28.             pop     esi                 // On restore source du stack
  29.             inc     esi                 // source++
  30.             jmp     dwhile              // Loop chaine
  31.         end_while:
  32.     }
  33. }


Message édité par h3bus le 08-03-2017 à 17:11:20

---------------
sheep++

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  ASM

  supprimer des voyelles dans une chaine de caracteres

 

Sujets relatifs
supprimer retour à la ligneJavascript - Controle d'une chaine de caractère
supprimer plusieurs retours à la lignesupprimer les lignes commençant par un mot
Rechercher une chaine qui ressemble à une autre en SQLrecupérer une chaine de texte d'un variable FOR
Word / supprimer certains caractères entre deux balisesCombien de caractères différents possibles pour un fichier ?
Supprimer derniere ligne d'un fichier SANS le parcourir 
Plus de sujets relatifs à : supprimer des voyelles dans une chaine de caracteres


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR