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 :

Bug de type de scanf


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 68
    Par défaut Bug de type de scanf
    j'aimerais enlever le bug du scan f qui survient quand l'utilisateur introduit une lettre ou autre à la place d'un chiffre. Pour cela j'ai remplacer le scanf %ld par un scan f %s.

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    int langue()
    {
    
    char langue_ch;
    char *langue_choisie = &langue_ch;
    do{
    
    printf("\n\nChoississez votre language\nWahlen Sie die Sprache\n\n\n1\tFrancais\n2\tAllemand\n\n");
    scanf("%s",&langue_ch);
    
    
    }while ((*langue_choisie != 1)&&(*langue_choisie != 2));
    
    switch (*langue_choisie){
    
    case 1:
    printf("\nLangue choisie : Francais\n");
    return 1;
    break;
    
    case 2:
    printf("\nSprache : Deutsch\n");
    return 2;
    break;
    
    }
    
    
    }
    mon problème c'est que même si l'utilisateur entre le caractère 1 ou 2 le programme ne les reconnait pas, car pas du même type, comment y rémédier svp?

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    On n'utilise pas scanf!!!!

    Vu comment tu t'en sers, c'est normal!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char langue_ch;
    char *langue_choisie = &langue_ch;
    Et tu l'utilise comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    scanf("%s",&langue_ch);
    scanf va vouloir mettre un '\0' à la fin de la chaîne, tu penses que tu as alloué assez de place ???

    Jc

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 68
    Par défaut
    Voilà j'ai utilisé un fgets pour la saisie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fgets(&langue_ch,20, stdin);
    printf ("%s",langue_choisie);
     
    }while ((*langue_choisie != 1)&&(*langue_choisie != 2));
    le printf me renvoie bien le chiffre/lettre que j'ai saisi. Mais même si c'est un 1 ou un 2 il ne les reconnait pas dans la condition de la boucle pourquoi?

  4. #4
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par K4trix
    Mais même si c'est un 1 ou un 2 il ne les reconnait pas dans la condition de la boucle pourquoi?
    Peut-être parce que dans ton tableau tu as '1' ou '2' et pas 1 ou 2 ?

    Le caractère ASCII n'est pas la même chose que le nombre....

    Jc

  5. #5
    Membre expérimenté

    Étudiant
    Inscrit en
    Mai 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 200
    Par défaut
    il y a une différence entre le chiffre 1 et le caractère '1'

    toi dans ton cas c'est un caractère que tu veux, donc déclare un caractère plutot d'une chaine. Lit ton caractère (getchar) puis compare le à '1' ou '2' (et pas 1 ou 2)

    voilà je pense que ca devrait t'aider.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 68
    Par défaut
    vous arriveriez à me gribouiller un bout de code pour tester une entrée avec une valeur int en mémoir, car la je suis vraiment perdu..., je dois être à un poil de cul de la solution mais bon....

  7. #7
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    As tu essayé de comparer ainsi ton caractère:

    fgets(&langue_ch,20, stdin);
    printf ("%s",langue_choisie);

    }while ((*langue_choisie != '1')&&(*langue_choisie != '2'));
    Pas besoin de convertir en valeur entière.

    Sinon tu déclares ton pointeur de type entier et tu compares à 1 ou 2.

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par floflo_2006
    il y a une différence entre le chiffre 1 et le caractère '1'

    toi dans ton cas c'est un caractère que tu veux, donc déclare un caractère plutot d'une chaine. Lit ton caractère (getchar) puis compare le à '1' ou '2' (et pas 1 ou 2)

    voilà je pense que ca devrait t'aider.
    Ben non. La solution avec fgets() est la bonne. Visiblement, tu ne connais pas le fonctionnement réel de getchar() (aka fgetc(stdin))

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers
    http://emmanuel-delahaye.developpez.com/notes.htm#fgetc (au cas où tu l'aurais loupé)

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

Discussions similaires

  1. Bug Type Double dans Access 2007
    Par kurkaine dans le forum C++Builder
    Réponses: 1
    Dernier message: 11/07/2007, 17h35
  2. [PEAR][DB] Unsupported operand types in Renderer.php
    Par brissou dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 10/05/2007, 13h50
  3. Réponses: 4
    Dernier message: 12/06/2006, 15h43
  4. Bug strtok sur chaine de type x;y;;z
    Par CanardJM dans le forum C
    Réponses: 15
    Dernier message: 05/01/2006, 10h16

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