[C] problème avec scanf()

problème avec scanf() [C] - C - Programmation

Marsh Posté le 22-01-2008 à 09:24:31    

Bonjour a tous.
Voila j'ai un petit souci  
je demande un numéro a l'utilisateur compris entre 1 et 1000  
je test la valeur entrée et je lui répond
Seul problème lorsque l'on rentre une lettre au lieu d'un chiffre mon programme boucle et plante ... il ne redemande plus la valeur et boucle
une idée pour eviter cela ?
Pour complément je suis sous un cygwin et je compile avec gcc.
ci dessous mon code
 

Code :
  1. #include <stdio.h>
  2. #include <signal.h>
  3. int i;
  4. int nbuser;
  5. verifentree(nbuser,petit,grand){
  6. if ( nbuser < 1 || nbuser > 1000){
  7. printf(" votre nombre n'est pas dans la fourcette \n" );
  8. //comptcoup();
  9. i = 0;
  10. return i, nbuser;
  11. }
  12. else {
  13. printf("votre nb est bien dans la fourchette attendu \n il va etre envoyé au serveur \n" );
  14. //comptcoup();
  15. i = 1;
  16. return i;
  17. }
  18. }
  19. main() {
  20. //int nbuser;
  21. do{
  22. printf(" PERE >> Entrez votre nombre entre 1 et 1000 \n" );
  23. scanf("%d", &nbuser);
  24. printf(" vous avez saisie la valeur %d \n", nbuser);
  25. verifentree(nbuser);
  26. //printf(" coup = %i",coup);
  27. }
  28. while (i != 1);
  29. printf("PERE >> ok \n" );
  30. }

Reply

Marsh Posté le 22-01-2008 à 09:24:31   

Reply

Marsh Posté le 22-01-2008 à 10:18:35    

ne pas utiliser scanf mais fgets+strtol ou sscanf qui permettent de controler l'entrée

Reply

Marsh Posté le 22-01-2008 à 10:24:57    

Toutes les fonctions ...scanf() (scanf, fscanf, sscanf) ne doivent être utilisées que si l'on a conscience de deux choses : le pattern de lecture doit être conçu de façon à gérer tous les cas, et il faut vérifier le code retour pour gérer les problèmes de lecture.
 
Il vaut donc mieux utiliser fgets(), couplé à une fonction de conversion : strtol, strtod et consors.
On peut aussi utiliser fgets+sscanf comme le suggère Joel F, mais je trouve que c'est sortir l'artillerie lourde lorsqu'il n'y a qu'une seule valeur à convertir, sans formatage particulier, comme ici.

Reply

Marsh Posté le 22-01-2008 à 10:26:23    

Prend un livre de C et corrige ce code.
scanf n'est pas une fonction pour les débutants, encore moins pour des entrées utilisateurs.

Reply

Marsh Posté le 22-01-2008 à 10:35:30    

Bon sinon, en dehors de scanf, il y a des problèmes avec ton code :

Citation :

taiste.c:5: warning: return type defaults to `int'
taiste.c: In function `verifentree':
taiste.c:10: warning: left-hand operand of comma expression has no effect
taiste.c: At top level:
taiste.c:19: warning: return type defaults to `int'
taiste.c: In function `main':
taiste.c:30: warning: control reaches end of non-void function


 
Utilise l'option "-Wall" de gcc pour voir ces avertissements.
 

Code :
  1. int i;
  2. int nbuser;


 
À moins de savoir vraiment ce que tu fais et d'avoir une très bonne raison pour ça, ce qui n'est pas le cas ici, n'utilise pas de variable globale. C'est mal.
 

Code :
  1. verifentree(nbuser,petit,grand){


 
Manquent les types de retour et des arguments.
Par défaut le compilateur assume qu'il s'agit d'entiers (int), mais c'est mal de laisser l'ambiguïté s'installer.
 

Code :
  1. return i, nbuser;


Cette ligne ne fait pas ce que tu crois.
 
Elle signifie : "retourner i, puis évaluer nbuser" (ce qui n'arrive jamais).
Une fonction ne peut jamais retourner qu'une seule valeur.
 

Code :
  1. main() {


 
Les deux seuls prototypes de main()  valides sont :
int main(void)
et
int main(int argc, char **argv)
 

Code :
  1. }


main() est censé retourner une valeur int, pour indiquer à l'appelant du programme dans quel état est sorti le programme (on assume qu'un code retour à 0 signifie que tout s'est bien passé).
Donc il faut ajouter un return.

Reply

Marsh Posté le 22-01-2008 à 10:41:28    

merci a tous pour ces présicions.
Désolé d'etre brouillons je débute en C
( cours du cnam powa :p )

Reply

Marsh Posté le 22-01-2008 à 11:02:15    

Elmoricq a écrit :

Code :
  1. return i, nbuser;


Cette ligne ne fait pas ce que tu crois.
 
Elle signifie : "retourner i, puis évaluer nbuser" (ce qui n'arrive jamais).
Une fonction ne peut jamais retourner qu'une seule valeur.

Tu en es sûr ??
J'aurais plutôt dit qu'elle retournait la valeur de nbuser.
Si je ne m'abuse, i est évalué, puis nbuser et c'est la valeur du dernier qui est retourné (à moins que la précédence de return soit plus élvée que celle de la virgule ?)

Reply

Marsh Posté le 22-01-2008 à 11:19:30    

Ah tiens, bonne question (même si au final c'est pas le genre de cas que tu rencontres souvent [:ddr555]).
 
C'est facile d'avoir la réponse, voyons ça :

Code :
  1. #include <stdio.h>
  2. int blabla(void)
  3. {
  4.    int i = 0, j = 1;
  5.  
  6.    return i, j;
  7. }
  8. int main(void)
  9. {
  10.    printf("And teh result is : %d\n", blabla());
  11.    return 0;
  12. }


 
Bon déjà, ça part mal pour moi [:joce]

Citation :

taiste.c: In function `blabla':
taiste.c:7: warning: left-hand operand of comma expression has no effect


 
Exécutons le bazar :

$ a.out
1


 
J'ai perdu [:zytrasnif]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed