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 :

Probleme de fonction scanf()


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut Probleme de fonction scanf()
    Bonjour ...

    La question peut paraitre con ... Mais je bloque sur ce probleme ...

    Alors voila .. Je demande a l'utilisateur de rentrer une valeur ... S'il rentre une valeur, on prend cette valeur la pour etre utilisée, mais si l'utilisateur tape "enter" sans même entrer de valeur, on utilise la valeur par défaut ... Hors scanf ne veut apparement pas prendre le "enter" ...

    Bon c'est peut etre pas clair ... Alors voila un bout de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    int main(void)
    {
        float tmpVal;
        float val = 1000;
     
        printf("Entrez une valeur pour Val [%.0f] -> ", val);
        scanf("%f", &tmpVal);
        printf("\n");
     
        if(tmpVal != "") val = tmpVal;
     
        printf("val = %.0f ||||| tmpVal = %.0f", val, tmpVal);  
     
    }
    Il faudrait peut etre utiliser autre chose qu'un scanf ... Mais voila ... J'ai un peu de mal :s


    Merci d'avance

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Points : 107
    Points
    107
    Par défaut
    As-tu regardé du côté de
    http://c.developpez.com/faq/?page=cl...EN_scanf_fgets

    Je pense que ça pourrait t'aider..

  3. #3
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par frenchi Voir le message
    As-tu regardé du côté de
    http://c.developpez.com/faq/?page=cl...EN_scanf_fgets

    Je pense que ça pourrait t'aider..
    Oui, j'ai déjà été voir les FAQ dispo

    Mais le probleme du fgets ou gets, c'est qu'il demande une chaine de caractere ... Hors la je voudrais directement recuperer un float ...
    (ernfin je pense)

  4. #4
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par nuFox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (tmpVal != "")
        val = tmpVal;
    tmpVal est un float, qu'espères-tu avoir en retour en le comparant avec "" (qui est une chaîne) ? Même l'initialisation de val n'est pas "bonne". C'est tout à fait correct grâce aux conversions implicites, mais c'est à éviter lorsqu'on débute (du moins selon mon avis personnel ...). 1000 est un entier (de type int) et val est un float. Pour être plus propre, tu devrais affecter un float et non un entier à un float c'est-à-dire mettre 1000f à la place de 1000.
    Mais le probleme du fgets ou gets, c'est qu'il demande une chaine de caractere
    Tu peux saisir une chaîne puis le convertir en réel (flottant) avec atof ou strtod. C'est même la méthode dite robuste. Utiliser fgets, gets est à banir (cette fonction ne permet pas de spécifier la taille du tampon).

  5. #5
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par Melem Voir le message
    tmpVal est un float, qu'espères-tu avoir en retour en le comparant avec "" (qui est une chaîne) ? Même l'initialisation de val n'est pas "bonne". C'est tout à fait correct grâce aux conversions implicites, mais c'est à éviter lorsqu'on débute (du moins selon mon avis personnel ...). 1000 est un entier (de type int) et val est un float. Pour être plus propre, tu devrais affecter un float et non un entier à un float c'est-à-dire mettre 1000f à la place de 1000.
    Tu peux saisir une chaîne puis le convertir en réel (flottant) avec atof ou strtod. C'est même la méthode dite robuste. Utiliser fgets, gets est à banir (cette fonction ne permet pas de spécifier la taille du tampon).
    Merci pour ta réponse ...
    Concernant la comparaison entre tmpVal et "" ... Je me suis rendu compte de mon erreur après ...
    Concernant l'initialisation, j'ai repris des valeurs simples ... Sinon dans le "bon" code ... Ce sont des valeurs décimales qui lui sont donnés !

    Enfin merci
    Je vais aller mettre ca en pratique

  6. #6
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Bonjour ... Voila j'ai essayé d'utiliser fgets

    Ca fonctionne pour le vMax, mais pas pour movementAmplitute ... Je ne comprend pas pourquoi car c'est le même type de donnée et le même type de traitement ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
      float movementAmplitute = 8000;
      float vMax = 0;
      char saisie[10];
     
      printf("Valeur pour movement amplitute [%.0f] ? ", movementAmplitute);
      fgets(&saisie[0], sizeof(saisie), stdin);
      if(saisie[0] != '\0')
        movementAmplitute = atof(&saisie[0]);
      printf("\n");
     
      while(vMax == 0){
        printf("Valeur pour VMAX ? ", vMax);
        fgets(&saisie[0], sizeof(saisie), stdin);
        if(saisie[0] != '\0')
          vMax = atof(&saisie[0]);
        printf("\n");
      }
    Bon j'espere que j'ai pas fais de trop grosse faute :$

  7. #7
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    1. saisie tout court est équivalent à & saisie[0]. Ca allège l'écriture.

    2. fgets lit le caractère '\n' qui marque la fin d'une ligne. Si stdin est connecté au clavier ce caractère est généré par l'appui de la touche ENTREE. Donc pour tester si l'utilisateur n'a pas entré une chaîne vide c'est if (saisie[0] != '\n'), le '\0' se trouve en 2ème position (saisie[1]).

    3. fgets n'est pas vraiment "immédiatement adaptée" à la saisie, car il retient le '\n' qu'on n'a gnéralement pas besoin. C'est pourquoi il faut se fabriquer des fonctions de saisie perso, en utilisant fgets. Il y a plein d'exemples sur ce forum. Tu peux en trouver également dans mon tutoriel dinitiation au langage C.

  8. #8
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par Melem Voir le message
    1. saisie tout court est équivalent à & saisie[0]. Ca allège l'écriture.

    2. fgets lit le caractère '\n' qui marque la fin d'une ligne. Si stdin est connecté au clavier ce caractère est généré par l'appui de la touche ENTREE. Donc pour tester si l'utilisateur n'a pas entré une chaîne vide c'est if (saisie[0] != '\n'), le '\0' se trouve en 2ème position (saisie[1]).

    3. fgets n'est pas vraiment "immédiatement adaptée" à la saisie, car il retient le '\n' qu'on n'a gnéralement pas besoin. C'est pourquoi il faut se fabriquer des fonctions de saisie perso, en utilisant fgets. Il y a plein d'exemples sur ce forum. Tu peux en trouver également dans mon tutoriel dinitiation au langage C.
    Merci pour toute des précisions

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 17
    Dernier message: 24/03/2005, 12h24
  2. [langage] problème avec fonction read
    Par domidum54 dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2004, 20h42
  3. [VB6]Problème de fonction
    Par mustang-ffw02 dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 27/03/2004, 15h09
  4. Probleme de fonction
    Par yenna dans le forum ASP
    Réponses: 6
    Dernier message: 01/03/2004, 14h10
  5. [debutant]la fonction scanf
    Par kalaka dans le forum C
    Réponses: 7
    Dernier message: 01/07/2003, 15h15

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