Problème de lecture au clavier en C

Fermé
Yakurena Messages postés 47 Date d'inscription samedi 27 mars 2004 Statut Membre Dernière intervention 1 juillet 2007 - 15 juil. 2005 à 22:56
 Cmanu - 10 oct. 2008 à 12:59
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
15 juil. 2005 à 23:41
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 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
18 juil. 2005 à 01:25
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 5929 Date d'inscription mercredi 26 mai 2004 Statut Contributeur Dernière intervention 18 septembre 2009 215
18 juil. 2005 à 09:41
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
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 5929 Date d'inscription mercredi 26 mai 2004 Statut Contributeur Dernière intervention 18 septembre 2009 215
18 juil. 2005 à 12:49
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
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