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' .