défilement de caractères de gauche à droite

défilement de caractères de gauche à droite - C - Programmation

Marsh Posté le 16-05-2005 à 11:04:28    

je cherche à réaliser un prog c qui décale d'un rang les caractères une chaine de gauche à droite. Par exemple :
 
"oooooooo>>>>>>>>"
">oooooooo>>>>>>>"
">>oooooooo>>>>>>"
">>>oooooooo>>>>>"
">>>>oooooooo>>>>"
">>>>>oooooooo>>>"
etc à chaque itération. Sachant que je dois rediriger le flux vers un afficheur LCD 8 caractères, je réalise ensuite un masque sur les 8 premiers caractères avec %.8s dans mon printf.
 
 
mon code actuel ne fonctionne pas et je ne comprends pas pourquoi... :cry:  
int main()
{
    char phrase[58];
    char tampon;
    int k = 0;
    int i = 0;
    int nb_char = 0;
 
    sprintf(phrase,"oooooooo>>>>>>>>" );
    nb_char=strlen(phrase);
 
    for (k=0;k<30;k++)
    {
        tampon = phrase[nb_char-1];
        for (i=0;i<nb_char-2;i++) phrase[nb_char-1-i]=phrase[nb_char-2-i];
        phrase[0]=tampon;
        printf("%.8s\n",phrase);
    }
    return 0;
}
 
En effet, j'obtiens :
>ooooooo
>ooooooo
>ooooooo
>ooooooo
>ooooooo
>ooooooo
>ooooooo
>ooooooo
oooooooo
oooooooo
oooooooo
oooooooo
oooooooo
oooooooo
oooooooo
oooooooo
oooooooo
oooooooo
oooooooo
oooooooo
oooooooo
oooooooo
oooooooo
oooooooo
oooooooo
oooooooo
oooooooo
oooooooo
oooooooo
oooooooo
 


---------------
celui qui pose une question est idiot 5 minutes, celui qui n'en pose pas le reste toute sa vie.
Reply

Marsh Posté le 16-05-2005 à 11:04:28   

Reply

Marsh Posté le 16-05-2005 à 11:25:57    

désolé...
for (i=nb_char-1;i>0;i--) phrase[i]=phrase[i-1];
 
au lieu de  
 
for (i=0;i<nb_char-2;i++) phrase[nb_char-1-i]=phrase[nb_char-2-i];
 
et c'est tout bon :sol:  
 
il n'empêche que je ne comprends toujours pas pourquoi ça ne fonctionne pas...


---------------
celui qui pose une question est idiot 5 minutes, celui qui n'en pose pas le reste toute sa vie.
Reply

Marsh Posté le 16-05-2005 à 11:50:26    

for (i=0;i<nb_char-1;i++) phrase[nb_char-1-i]=phrase[nb_char-2-i];
ou
for (i=0;i<=nb_char-2;i++) phrase[nb_char-1-i]=phrase[nb_char-2-i];

Reply

Marsh Posté le 16-05-2005 à 12:57:12    

skelter a écrit :

for (i=0;i<nb_char-1;i++) phrase[nb_char-1-i]=phrase[nb_char-2-i];
ou
for (i=0;i<=nb_char-2;i++) phrase[nb_char-1-i]=phrase[nb_char-2-i];


 
merci... coup classique  :whistle:


---------------
celui qui pose une question est idiot 5 minutes, celui qui n'en pose pas le reste toute sa vie.
Reply

Marsh Posté le 16-05-2005 à 15:32:33    

bipeuh a écrit :

tuel ne fonctionne pas et je ne comprends pas pourquoi...


Meuh...

../main.c:13: warning: function declaration isn't a prototype
 
../main.c: In function `main_':
../main.c:20: warning: implicit declaration of function `sprintf'
../main.c:20: warning: nested extern declaration of `sprintf'
<internal>:0: warning: redundant redeclaration of 'sprintf'
 
../main.c:21: warning: implicit declaration of function `strlen'
../main.c:21: warning: nested extern declaration of `strlen'
 
<internal>:0: warning: redundant redeclaration of 'strlen'
../main.c:28: warning: implicit declaration of function `printf'
../main.c:28: warning: nested extern declaration of `printf'
<internal>:0: warning: redundant redeclaration of 'printf'


 
Une bonne occasion d'utiliser memmove()... (pas subtil, mais simple et correct). On pourraut être plus fin et éviter ces copies incessantes en utilisant un ou deux index de lecture tournant...


#include <stdio.h>
#include <string.h>
 
int main (void)
{
   char phrase[58] = "123456789abcd";
   size_t const nb_char = strlen (phrase);
   int k;
 
   for (k = 0; k < 30; k++)
   {
      int tampon = phrase[nb_char - 1];
 
      memmove (phrase + 1, phrase, nb_char -1);
      phrase[0] = tampon;
 
      printf ("%.8s\n", phrase);
   }
   return 0;
}


Message édité par Emmanuel Delahaye le 16-05-2005 à 15:49:41

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 25-05-2005 à 10:54:49    

c'est tout de suite plus élégant!


---------------
celui qui pose une question est idiot 5 minutes, celui qui n'en pose pas le reste toute sa vie.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed