Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3146 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] problème avec scanf()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] problème avec scanf()

n°1674793
dr4g0n
amateur de princesse en sauc
Posté le 22-01-2008 à 09:24:31  profilanswer
 

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. }

mood
Publicité
Posté le 22-01-2008 à 09:24:31  profilanswer
 

n°1674814
Joel F
Real men use unique_ptr
Posté le 22-01-2008 à 10:18:35  profilanswer
 

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

n°1674824
Elmoricq
Modérateur
Posté le 22-01-2008 à 10:24:57  profilanswer
 

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.

n°1674825
Trap D
Posté le 22-01-2008 à 10:26:23  profilanswer
 

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.

n°1674840
Elmoricq
Modérateur
Posté le 22-01-2008 à 10:35:30  profilanswer
 

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.

n°1674850
dr4g0n
amateur de princesse en sauc
Posté le 22-01-2008 à 10:41:28  profilanswer
 

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

n°1674878
Trap D
Posté le 22-01-2008 à 11:02:15  profilanswer
 

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 ?)

n°1674909
Elmoricq
Modérateur
Posté le 22-01-2008 à 11:19:30  profilanswer
 

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]


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] problème avec scanf()

 

Sujets relatifs
[Resolu] Ajout dynamique onclick et problème d'auto-executionProbleme mise en ligne d'un site web
petit problème d'allignementprobleme de regexp
[opera] problème avec attribut titleProblème de tri A à L, M à Z,...
Problème d'affichage sur blogCreation site, problème après tentative upload
[ MySQL ] - Problème avec GROUP BY - Help !Problème de miniaturisation avec frontpage
Plus de sujets relatifs à : [C] problème avec scanf()


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR