Problème de lecture au clavier en C

[Fermé]
Signaler
Messages postés
47
Date d'inscription
samedi 27 mars 2004
Statut
Membre
Dernière intervention
1 juillet 2007
-
 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

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 554
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);
}
Messages postés
30118
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 septembre 2021
7 173
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 ;)
Messages postés
5927
Date d'inscription
mercredi 26 mai 2004
Statut
Contributeur
Dernière intervention
18 septembre 2009
212
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
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
Messages postés
5927
Date d'inscription
mercredi 26 mai 2004
Statut
Contributeur
Dernière intervention
18 septembre 2009
212
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.
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 ^^