9
votes

Tandis que la boucle ignore scanf la deuxième fois

#include <stdio.h>

int main ()
{
    char loop='y';
    while(loop != 'n') {
        printf("loop? ");
        scanf("%c", &loop);
        if(loop != 'y') {
            loop='n';
        }
    }
    return 0;
}
If I type in 'y' he restart the while-loop but ignores the scanf the second time and end the loop after that. Can anyone help?

3 commentaires

3 Réponses :


18
votes

Assurez-vous que le code> scanaf code> rejette la nouvelle ligne. Changez-le à:

scanf(" %c", &loop);
       ^


1 commentaires

@ user1069968 Cet espace fait scanf ignore tous les espaces (y compris les nouvelles lignes).



10
votes

Vous avez probablement dû entrer une nouvelle ligne afin que l'entrée passe à votre programme, non? La deuxième fois que votre boucle s'exécute, il lit que le personnage de Newline, qui «attendant» soit lu et sort automatiquement la boucle ( '\ n'! = 'Y' code>). Vous pouvez définir Scanf Ignorer Whitespace en utilisant cette chaîne de format à la place:

" %c"


2 commentaires

C'est la réponse mieux expliquée sur ce fil. Merci d'avoir sauvegarder mes devoirs de mes copines! <3


Merci @austinwitherow, je suis heureux de savoir que cela vous a été utile :)



-2
votes

Une solution peut être l'utilisation fflush (stdin) après l'instruction scanf () pour effacer le tampon d'entrée.


3 commentaires

fflush (stdin) a un comportement non défini dans la programmation C. Cela pourrait fonctionner comme prévu sur certains systèmes, mais ce n'est pas une bonne pratique en général.


@ Nisseengström merci Nisse, je suis d'accord avec votre point. Ce n'est pas une bonne pratique car nous pouvons voir ici


Fflush Stdin travaille également sur Linux mais évitez de l'utiliser son UB, en l'utilisant, vous avez perdu la portabilité.