[C] [Shell] Affichage d'une chaîne de caractères progressivement [Résolu/Fermé]

Signaler
-
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
-
Bonjour,

La vie est un peu plus compliquée que ce simple titre, malheureusement. J'ai beau lire à droite à gauche sur le net, n'étant qu'un novice, j'ai encore quelques problèmes. Et même, je doute que mon problème soit abordé quelque part ailleurs (en tout cas je n'ai pas trouvé, puisque je viens vers vous pour m'aider dans ma démarche).

Mon problème : je travaille avec un shell, le terminal de Mac OS X, et j'aimerais réussir à faire une chaîne de caractères qui puisse s'afficher un par un, en C évidemment. Derrière, compilation du fichier, on le lance dans le terminal (exécutable Unix), et on regarde le texte s'afficher progressivement.

Mon idée : tout d'abord j'ai fait ça progressivement, en y allant caractère par caractère. Ça, j'ai réussi, ça s'affiche de la façon dont je le souhaite, un par un avec un délai suffisant (le concept c'est de faire « parler » un ordinateur). Je ne vous mettrai pas le code par contre, ça fait 60 lignes environ et c'est très laid.

Mon autre idée : automatiser tout ça avec des chaînes de caractères et des boucles ! Mais ça ne marche pas, c'est là que j'ai besoin de votre aide.

Voici mon code :
#include <stdio.h>
#include <string.h>

// Définition de variable
char chaine[] = "...\n\n";
char texte[] = "Bonjour Marc.\n";
int i;
char C;
char T;

int main(void)
{
    i = 0;
    
    for (i=0;chaine[i] != '\0';i++)// boucle d'affichage de la chaine
    {
        C = chaine[i];
        printf ("%c", C);
        sleep(1); // délai de séparation d'affichage des caractères
    }
    
    sleep(2); // pause
    i = 0; // reset i quand boucle finie
    
    for (i=0;texte[i] != '\0';i++)// boucle d'affichage du texte
    {
        T = texte[i];
        printf ("%c", T);
        usleep(200000); // délai de séparation d'affichage des caractères
    }
}


Auriez-vous des pistes pour m'aider à corriger mon problème ?
Je vous prie aussi de bien vouloir excuser les erreurs qui pourraient se trouver dans ce code et être grossières, je n'ai que peu d'expérience en C malheureusement.

Bien à vous.

4 réponses

Bonjour, plutôt que printf, tu peux aussi utiliser la fonction "write" (en incluant unistd.h).
Elle prend trois paramètres :
-le file descriptor dans lequel il faut écrire (met 1 pour écrire dans la sortie standard, c'est à dire dans ton terminal).
-un char * qui correspondra au début de la chaine à afficher (donc juste un pointeur vers le caractère à afficher).
-le nombre de caractères à afficher (1 dans ton cas).

De plus, pourquoi passer par T et C? tu peux écrire directement texte[i] dans printf!

Enfin, ton prototype du main stipule que le main renvoie un int, or il n'y a aucun retour à la fin de ta fonction!

Edit: Sleep, et usleep c'est quoi comme fonctions? ;)
Une c'est du shell il me semble et l'autre vient de unistd je crois bien, pas vraiment étonnant si ça ne compile pas.
Sinon pour exécuter une commande shell dans un .c, il y a la fonction system qui prend en paramètre la commande en question. (en incluant stdlib.h)
Ah, je ne connaissais pas la fonction write, merci beaucoup !

Pour le passage par T et C, c'était juste une tentative alternative puisque ça ne fonctionnait pas en utilisant texte[i] dans le printf ^^' Mais le problème ne venait pas de là, et je n'ai pas enlevé ce truc avant de poster.

En tout cas, je te remercie pour ta réponse rapide, je vais tester ça de suite.
Utilisateur anonyme
avec les modifications adéquates ça fonctionne chez moi en tout cas.

Bon courage!
« un char * qui correspondra au début de la chaine à afficher (donc juste un pointeur vers le caractère à afficher). »

J'ai veillé à bien corriger mon programme, mais le problème persiste : je n'arrive toujours pas à pointer vers i-ème caractère de ma chaîne de caractères pour l'afficher à l'écran.

J'ai bien :
write (1/*pour écrire dans la sortie standard*/,char *chaine/*j'avoue être dérouté par cette étape, que j'ai citée plus haut*/,1/*pour n'afficher qu'un seul caractère*/);

Ma question est donc à présent la suivante : comment je me débrouille avec mon pointeur pour qu'il affiche bien le i-ème caractère de la chaîne correspondant à chaque itération de la boucle ? Car jusque-là, il affiche seulement i fois le premier caractère de la chaîne.

Désolé d'être aussi mauvais, mais merci pour ton aide, j'avance bien !
Bon, je n'ai pas réussi en passant par la fonction write, mais finalement ça fonctionne très bien avec la fonction printf !

Il suffit juste de :
printf ("%c", chaine[i]);
fflush(stdout);


Si on ne nettoie pas les buffers dans la boucle, il va tout stocker puis afficher à la fin.
Là il affiche tour à tour, ce qui est le résultat que j'attendais !
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 736
Bonjour,

Non, n'utilise pas write(). C'est une fonction non standard. Utilise plutôt printf() comme tu fais ou fprintf() si tu souhaites écrire dans un fichier.

Les variables globales sont déconseillées. Je te conseille de plutôt les mettre en locales.

i=0; entre les deux for est inutile puisque tu initialises i dans la boucle for.