problème avec scanf() [C] - C - Programmation
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
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.
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.
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' |
Utilise l'option "-Wall" de gcc pour voir ces avertissements.
Code :
|
À 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 :
|
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 :
|
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 :
|
Les deux seuls prototypes de main() valides sont :
int main(void)
et
int main(int argc, char **argv)
Code :
|
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.
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 )
Marsh Posté le 22-01-2008 à 11:02:15
Elmoricq a écrit :
|
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 ?)
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 ).
C'est facile d'avoir la réponse, voyons ça :
Code :
|
Bon déjà, ça part mal pour moi
Citation : taiste.c: In function `blabla': |
Exécutons le bazar :
$ a.out |
J'ai perdu
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