Problème de lecture au clavier en C

Yakurena Messages postés 47 Date d'inscription   Statut Membre Dernière intervention   -  
 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.
A voir également:

5 réponses

lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
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
Canard007 Messages postés 5931 Date d'inscription   Statut Contributeur Dernière intervention   215
 
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
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
Canard007 Messages postés 5931 Date d'inscription   Statut Contributeur Dernière intervention   215
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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