Entrées-sorties

Entrées-sorties

by Alessio Verardo -
Number of replies: 2

Bonjour, j'aurais plusieurs questions concernant le cours d'hier. 

Pour l'exemple de boucle infinie à la slide 12, la boucle infinie est-elle due au fait que si on entre un 'a' par exemple, le caractère "reste bloqué" dans le stdin et à chaque tour de boucle, le programme essaie de réattribuer ce caractère à la variable int, ce qui ne fonctionne pas et en quelque sorte "supprime la ligne avec le scanf(...)" ? 

De plus il est écrit, à la slide 9, que fflush(stdin) n'a aucun effet sur stdin. Mais, j'ai essayé de faire un fflush(stdin) afin de "vider" le tampon après avoir tenté le scanf(...), et apparemment cela marche car je n'ai plus de boucle infinie... Du coup, est-ce que fflush(stdin) fait bien quelque chose à stdin ou était-ce juste un "coup de chance" et cela n'était pas censé fonctionner ? 

Dernière question, concernant l'exemple slide 22, pour avoir la longueur de la string écrite, vous utilisez la fonction strlen(...). Mais vous faites un -1 après. Au début, je pensais que c'était ne pas compter le \0 à la fin de la string. Mais apparemment, selon internet, la fonction strlen(...) ne compte pas ce \0. Du coup, je me demandais pourquoi vous faisiez -1 à la longueur ? 


Merci d'avance pour vos réponses et bonne journée, 

Alessio Verardo

In reply to Alessio Verardo

Re: Entrées-sorties

by Deleted user -

Bonjour,

> Pour l'exemple de boucle infinie à la slide 12, la boucle infinie est-elle due au fait que si on entre un 'a' par exemple, le caractère "reste bloqué" dans le stdin et à chaque tour de boucle, le programme essaie de réattribuer ce caractère à la variable int, ce qui ne fonctionne pas et en quelque sorte "supprime la ligne avec le scanf(...)" ? 

C'est le cas en effet. Le caractère 'a' reste indéfiniment dans le tampon stdin. À chaque tour de boucle, scanf tente de consommer des caractères numériques depuis stdin, mais échoue vu que le premier caractère qu'il rencontre est 'a'.

> De plus il est écrit, à la slide 9, que fflush(stdin) n'a aucun effet sur stdin. Mais, j'ai essayé de faire un fflush(stdin) afin de "vider" le tampon après avoir tenté le scanf(...), et apparemment cela marche car je n'ai plus de boucle infinie... Du coup, est-ce que fflush(stdin) fait bien quelque chose à stdin ou était-ce juste un "coup de chance" et cela n'était pas censé fonctionner ? 

Comme vous dites, c'est un coup de chance, ou plutôt un "undefined behaviour" dans le jargon C. Autrement dit, cela dépend du comportement adopté par le compilateur que vous utilisez. Dans votre cas, il semblerait qu'il vide le tampon de stdin. En définitive, écrire du code dépendant d'un comportement indéfini est à proscrire pour éviter justement ce genre de "coup de chance".

> Dernière question, concernant l'exemple slide 22, pour avoir la longueur de la string écrite, vous utilisez la fonction strlen(...). Mais vous faites un -1 après. Au début, je pensais que c'était ne pas compter le \0 à la fin de la string. Mais apparemment, selon internet, la fonction strlen(...) ne compte pas ce \0. Du coup, je me demandais pourquoi vous faisiez -1 à la longueur ? 

Là aussi, vous avez tout à fait raison. La fonction strlen ne compte par le caractère de terminaison. Il a été choisi de faire la soustraction ici plutôt que dans les deux lignes de code qui viennent après vu qu'en C (comme en Java) les tableaux sont indexés à partir de zéro. Si on réécrit le code sans le -1, on obtient:

len = strlen(nom_fichier);

if ((len > 0) && (nom_fichier[len - 1] == '\n'))

  nom_fichier[len - 1] = '\0';