1
votes

C: Faire imbriqué pendant que la boucle ne boucle pas correctement

Ce code est censé -

  • Comptez le nombre de caractères de la séquence d'entrée.
  • Répétez l'action jusqu'à ce que l'utilisateur quitte le programme.
  • Utilisez une boucle do-while imbriquée pour atteindre cet objectif.

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');


0 commentaires

3 Réponses :


1
votes

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 ++; .


1 commentaires

Il faudrait que ce soit if (I == ’\ n’) , n’est-ce pas?



2
votes

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');
}


0 commentaires

1
votes

Ce qui s'est passé:

  • getchar est une macro qui récupère un caractère de stdin .
  • Le délimiteur ( '\ 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é.
  • Cela provoque la fermeture de la boucle interne.

Ce qui pourrait être fait:

  • Insérez ce qui suit après 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 .
  • Nous lisons un caractère et le remettons s'il n'est pas '\ n' .


0 commentaires