Comment faire défiler un message sur le terminal?

J’essaie d’écrire un programme qui agit comme une sélection qui utilise la curses.h library pour créer un affichage à défilement latéral.

Ce qui devrait arriver, c’est que mon message “Bonjour” apparaisse défilant de gauche à droite du terminal, caractère par caractère.

“hello” devrait apparaître pour faire défiler le terminal de la manière suivante:

 | H| // fist frame of animation | He| //2nd | Hel| //3rd ... | Hello | // some time in the middle of animation |Hello | // finished. 

Au lieu de sembler faire défiler le terminal, mon programme envoie simplement le message “Hello” sur le côté gauche du terminal, comme s’il était terminé.

Je pensais qu’imprimer le nombre approprié d’espaces puis le nombre approprié de caractères de la chaîne chaque image fonctionnerait.

Qu’est-ce que je fais mal?

Vous trouverez ci-dessous mon code:

 #include  #include  main() { char message[] = "Hello"; int max_y, max_x; // max dimensions of terminal window int text_length; int i,row=0,col=0,spaces=0; // Get text length text_length = strlen(message); // Get terminal dimensions getmaxyx(stdscr, max_y, max_x); // num of spaces needed to print spaces = max_x -1; initscr(); // initialize curses clear(); // clear screen to begin while(1) { clear(); // clear last drawn iteration move(5,col); // print spaces as necessary for(i=0;i<spaces;i++) { addch(' '); } refresh(); // print appropriate number of characters of the message for(i=0;i<text_length || i<max_x; i++) { addch(message[i]); } refresh(); usleep(50000); // wait some time spaces = spaces-1; //adjust spaces need for next iteration } } 

Le premier problème est que vous appelez getmaxyx() avant initscr() . Dans cette situation, stdscr n’a pas été initialisé, donc les valeurs renvoyées par getmaxyx() n’ont pas de sens. (Je reçois -1 pour chaque valeur, aka ERR.)

Cela corrigé, le programme fonctionne fondamentalement, mais imprime des bric-à-brac après la chaîne “Hello”. Vous pouvez résoudre ce problème en modifiant le test de boucle for, text_length || i text_length || i , to text_length && i , bien que le résultat ne soit toujours pas tout à fait ce que vous voulez. Mais je vous laisse le soin de comprendre cela.

Enfin, d’un sharepoint vue stylistique, je suggérerais d’utiliser la fonction usleep() de usleep() place de usleep() (c'est-à-dire, napms(50) au lieu de usleep(50000) ). Mais si vous vous en tenez à usleep() , vous devriez append #include en haut.