Balayer un caractère avec% d

J’ai un exemple spécifique ci-dessous, qui fonctionne parfaitement si des entiers sont entrés (voir output1), lorsque j’essaie de scanner un caractère à l’aide de% d spécificateur dans l’appel de fonction scanf, j’obtiens le résultat ci-dessous.

Ma question est donc la suivante: si vous entrez un caractère, j’espère que le spécificateur de type le convertira en une valeur int équivalente, sinon une valeur indésirable, même dans les deux cas, il devrait imprimer / segfault. Mais ici, je reçois des impressions en continu, ce qui me semble faux, car scanf est de plus en plus ignoré. Je ne suis pas du tout sûr de ce qui se passe à l’arrière-plan et j’aimerais savoir la même chose.

#include  int main() { int a; while (1){ printf("enter a number:"); scanf("%d", &a); printf("entered number is %d\n", a); } return 0; } 

Sortie1 :

 > enter a number:1 > entered number is 1 > enter a number: > 3 > entered number is 3 > enter a number:4 > entered number is 4 > enter a number:5 > entered number is 5 enter a number: 

Output2 : pour l’entrée a

 > enter a number:entered number is 32767 > enter a number:entered number is 32767 > enter a number:entered number is 32767 > enter a number:entered number is 32767 > enter a number:entered number is 32767 > enter a number:entered number is 32767 > enter a number:entered number is 32767 > enter a number:entered number is 32767 > enter a number:entered number is 32767 

PS: Je sais que c’est une question stupide de demander ce qui se passe dans un cas non valide où un spécificateur de type non voulu (% d dans ce cas) est utilisé pour un type différent, mais j’aimerais savoir ce qui se passe en arrière-plan, le cas échéant. Merci

    Vous pouvez vérifier scanf en tant que mec du programmeur . Vous pouvez comparer les arguments de nombre remplis avec succès (Merci à @chux )

    Dans votre cas, scanf n’a trouvé aucune valeur entière, a atteint la fin de l’entrée et a renvoyé EOF, en laissant la variable intacte.

    En cas d’échec, il retournera EOF (voir http://www.cplusplus.com/reference/cstdio/scanf/#return ).

     if(scanf("%d", &a) == 1) //Check if exactly one parameter was read. printf("entered number is %d\n", a); 

    Pour les caractères, utilisez getch() ou du moins, demandez "%c" à scanf:

     if(scanf("%c", &a) == 1) printf("entered key was %d\n", a); 

    La valeur “indésirable” que vous recevez est ce qui était dans la mémoire de votre programme, car a n’est pas initialisé.