Ce code est censé -
Mais la boucle interne n'est exécutée qu'une seule fois.
Pourquoi?
#include <stdio.h> int main () { int x; char i, ans; i = '\0'; do { i = '\0'; x=0; printf("\nEnter sequence of character:"); do { i = getchar(); x++; } while(i!='\n'); printf("\nNumber of characters entered is: %d", --x); printf("\nMore sequences (Y/N) ?"); ans = getchar(); } while(ans =='Y' || ans == 'y');
3 Réponses :
Pas exactement sûr, mais je pense que lorsque l'utilisateur appuie sur Entrée pour terminer le premier caractère d'entrée, le tampon d'entrée conserve le bouton Entrée comme caractère \ n
. Essayez d'ajouter if (i == '\ n') getChar ();
après x ++;
.
Il faudrait que ce soit if (I == ’\ n’)
, n’est-ce pas?
Après avoir lu la réponse oui / non (la ligne avec ans = getchar ();
), vous lirez un "y"
et un "\ n"
. Vous consommerez le "y"
et le traiterez, mais la prochaine itération lorsque vous lirez i = getchar ();
, i
consommera le "\ n"
restant, ainsi rompra cette boucle do-while.
Bien que ce ne soit pas ma solution préférée, une solution de contournement simple est la suivante:
#include <stdio.h> int main () { int x; char i, ans; i = '\0'; do { i = '\0'; x=0; printf("\nEnter sequence of character:"); do { i = getchar(); x++; } while(i!='\n'); printf("\nNumber of characters entered is: %d", --x); printf("\nMore sequences (Y/N) ?"); ans = getchar(); getchar(); } while(ans =='Y' || ans == 'y'); }
Ce qui s'est passé:
getchar
est une macro qui récupère un caractère de stdin
. '\ n'
dans ce cas) est compté comme un
caractère qui reste dans la mémoire tampon et est récupéré la prochaine fois
getchar ()
est appelé. Ce qui pourrait être fait:
ans = getchar ();
i = getchar(); if(i != '\n') ungetc(i,stdin);
Nouveau code expliqué:
ungetc (int x, FILE * stream)
repousse un caractère dans le flux d'entrée. stdin
est le flux d'entrée standard défini dans
. '\ n'
.