Problème de lecture au clavier en C

Yakurena Messages postés 32 Date d'inscription   Statut Membre -  
 Cmanu -
Bonsoir,
J'ai remarqué que la lecture au clavier, en langage C, pose souvent des problèmes, surtout dans le cas de la lecture d'entiers : quand on doit entrer un entier au clavier, et que celui qui execute le programme tape quelque chose avec au moins une lettre,l'entier prend une valeur bizarre(toujours la même : 1075028800).
Mais c'est encore pire quand la lecture de l'entier se situe dans une boucle : dans ce cas,il suffit de lire une fois une mauvaise valeur au clavier pour le programme boucle ensuite indéfiniment sans jamais rendre la main à l'utilisateur.

Le programme ci-dessous est censé lire un entier au clavier jusqu'à ce que cette valeur lue soit égale à 0.
******************************************************
#include<stdio.h>

main()
{ int entier; float reel; char caractere;char* chaine;
do {
puts("Entrez un entier : 0 pour arreter");
scanf("%d",&entier);
printf("entier = %d\n",entier);
} while(entier); exit(0);
******************************************************

Lorsque je l'execute et que j'entre,par exemple, abc, voici les resultats de l'execution :
******************************************************
Entrez un entier : 0 pour arreter
entier = 1075028800
Entrez un entier : 0 pour arreter
entier = 1075028800
Entrez un entier : 0 pour arreter
entier = 1075028800
Entrez un entier : 0 pour arreter
entier = 1075028800
Entrez un entier : 0 pour arreter
entier = 1075028800
............................................. (et ceci des centaines de fois)
*****************************************************

En Java, ce problème est evitable grace à l'exception declenchée lors de l'appel de la méthode parseInt,mais en C, je ne vois pas du tout comment résoudre le problème. Si qqn pouvait me dépanner...
Merci d'avance.

5 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,
    #include<stdio.h>
    
    main()
    {
    int entier;
    
    do
      {
        printf("Entrez un entier (0 pour arreter) : ");
        scanf("%d",&entier);
        printf("entier = %d\n",entier);
       }
    while(entier != 0);
    }
    0
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    man scanf
    
    SYNOPSIS
           #include <stdio.h>
           int scanf(const char *format, ...);
           int fscanf(FILE *stream, const char *format, ...);
    [...]
    RETURN VALUE
           These  functions  return the number of input items assigned, which can be fewer than
           provided for, or even zero, in the event of  a  matching  failure.   Zero  indicates
           that,  while there was input available, no conversions were assigned; typically this
           is due to an invalid input character, such as an alphabetic  character  for  a  `%d'
           conversion.  The value EOF is returned if an input failure occurs before any conver-
           sion such as an end-of-file occurs. If an error or end-of-file occurs after  conver-
           sion  has  begun,  the  number  of  conversions which were successfully completed is
           returned.


    Bonne chance ;)
    0
  3. Canard007 Messages postés 5954 Date d'inscription   Statut Contributeur 216
     
    je te conseil:
    1 de ne pas faire une saisie d'entier directement mais de recuperer le resultat sous forme de charactere et ensuite de tester si c'est bien un entier puis le convertir en entier.
    2 de vider ton buffer de clavier avec la commande fflush
    0
  4. imed
     
    ce normal que vous tombait dans un boucle infinit car votre condition d'arrét(while(entier)) est fausse éssayé de nouveau avec ces instruction :
    do
    ....

    while(entier=0)
    // bon chance
    0
    1. Canard007 Messages postés 5954 Date d'inscription   Statut Contributeur 216
       
      la condition est bonne puisqu'il s'agit bien de boucler tant que la valeur n'est pas 0.
      de plus
      entier=0 est une affectation et non pas une condition...resultat boucle infinie.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Cmanu
     
    la boucle doit finir par
    while (entier != 0);

    " != " signifie : "différent de"
    donc "while(entier != 0)" signifie : "tant que entier différent de 0"
    donc pour ta boucle, si tu rentre un caractère en " %d " ton prgramme va bugger, j'ai le même problème avec mon programme du snake ^^
    0