IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Vérifier si la valeur entrée dans une variable est un nombre


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 32
    Points : 17
    Points
    17
    Par défaut Vérifier si la valeur entrée dans une variable est un nombre
    Bonjour,

    Je suis entrain de faire un programme qui permet de vérifier si la valeur entrée dans une variable est un nombre.
    J'ai essayé avec la fonction isdigit mais je ne suis pas sur de la syntaxe.
    Voilà le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    float fct_VERIF_E0(char loc_E0)
    {
            do{
            printf("Entrez une nouvelle valeur pour E0 : \n");
     
            scanf("%f",&loc_E0); 
     
            }while(isdigit(loc_E0)!=0);
     
    return(0);
    }
    Pouvez-vous m'aider svp?
    Merci

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 22
    Points : 37
    Points
    37
    Par défaut
    Je pense que tu as bien utilisé la fonction isdigit, mais par contre je trouve bizarre que tu mette un %f dans ton scanf alors que ta variable est un char

    EDIT : Effectivement, la compilation plante à cause de ça. Mais si tu met un %c, il sera automatiquement considéré comme un caractère. Donc je pense que c'est un problème au niveau de l'algorithme.

  3. #3
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Points : 10 180
    Points
    10 180
    Par défaut
    Je vais essayer de répondre mais je ne suis pas sur de comprendre tous a fait,du a cause que en général un char n'est pas vraiment utilisé pour stocker des nombres en plus d’être limité a 256 chiffres.
    M'enfin tu peux utilise "%d" , scanf retourne un int ,cette valeur représente le nombre de valeurs convenablement introduites ou EOF (-1)en cas d'erreur.
    Dans ton cas il retournera 1 si on entre des chiffres.

    Mais bon vu que scanf plantera ou buggera , tu sera obliger de le coder toi même avec getchar.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 901
    Points : 219 902
    Points
    219 902
    Billets dans le blog
    126
    Par défaut
    http://c.developpez.com/faq/?page=st...RINGS_numtostr

    Sinon avec sscanf:
    Si scanf renvoit le nombre d'élément à récupéré (indiquer par le format (le truc avec les '%')) cela indique que la conversion fonctionne, donc que ce qu'il y avait en entrée était du bon format (donc un nombre pour ce cas là)

    Dans votre cas, vous allez planter si l'utilisateur rentre de grand nombre.

    Il faudrait essayer de récupéré directement un float, au lieu d'utiliser un caractère pour stocker l'entrée.
    Du coup, il serai facile d'imaginer un code comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int monNombre;
    int nombreLus = 0;
    do{
            printf("Entrez une nouvelle valeur pour E0 : \n");
     
            nombreLus = scanf("%d",&monNombre); 
     
            }while(nombreLus != 1);

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    1 - En utilisant le format %f dans scanf, tu obtiens un nombre flottant sous forme de sa représentation binaire en mémoire. isdigit() s'applique à un caractère donc est inutilisable dans ce cas.

    2- Effectivement, tu peux utiliser la valeur de retour de scanf() pour savoir si la conversion a été possible, donc si (le début de) la ligne tapée représente un nombre flottant.

    LittleWhite présente un exemple erronné. Passons sur le fait qu'il présente le cas pour la lecture d'un entier et non d'un flottant car c'est facilement adaptable, mais surtout la boucle do while ne fonctionne pas : En cas d'échec de lecture du nombre, la boucle est infinie.
    L'échec a lieu si l'entrée n'est pas un nombre et dans ce cas le buffer clavier reste inchangé. Il sera lu de nouveau avec le scanf() qui naturellement échouera etc.
    Il faut absolument vider le buffer clavier après un échec de la lecture du scanf() (ou, ce qui ne fera pas de mal, après la lecture du scanf dans tous les cas)

    Pour vider le buffer clavier, voir par exemple la FAQ Comment vider le buffer clavier ? ou utiliser un autre scanf() pour le faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    float monNombre;
    int nombreLus = 0;
    do
    {
       printf("Entrez une nouvelle valeur pour E0 : \n");
       nombreLus = scanf("%f",&monNombre);
       scanf("%*[^\n]%*c");
    }while(nombreLus != 1);

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    On peut constater que scanf() est très utilisé pour la lecture des entrées clavier. Pourtant tous les documents (ou presque) précisent qu'il vaut mieux utiliser l'association de fgets() (par exemple) et de sscanf().
    la logique est simple :
    1- l'utilisateur tape des caractères puis "Entrée", mais il a peut-être fait des fautes.
    2- le programme lit tout ce qu'a tapé l'utilisateur
    3- le programme peut examiner ce qui a été lu et agir en conséquence.
    Cette façon de faire me parait bien préférable.

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/02/2008, 20h16
  2. [Débutant] Validation d'une valeur numérique dans une variable String
    Par anto84 dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 11/07/2007, 10h26
  3. Réponses: 4
    Dernier message: 09/06/2007, 01h33
  4. [VB6 ArcView9] Recuperer valeur RMS dans une variable
    Par TiT0f dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 23/05/2006, 15h49
  5. Comment afficher une valeur contenue dans une variable ?
    Par manubrard dans le forum Langage
    Réponses: 5
    Dernier message: 20/02/2006, 15h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo