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

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 68
    Points : 44
    Points
    44
    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 éminent sénior

    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 : 43
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    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 du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 68
    Points : 44
    Points
    44
    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 éminent sénior

    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 : 43
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    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 actif

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 200
    Points : 276
    Points
    276
    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 du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 68
    Points : 44
    Points
    44
    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 éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    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
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 68
    Points : 44
    Points
    44
    Par défaut
    voici le code complet actuel :

    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
    30
    31
    32
    33
    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("%d",&langue_ch);
     
     
    fgets(&langue_ch,20, stdin);
    printf ("%s",langue_choisie);
     
     
    }while ((*langue_choisie != '1')&&(*langue_choisie != '2'));
     
    switch (langue_ch){
     
    case 1:
    printf("\nLangue choisie : Francais\n");
    return 1;
    break;
     
    case 2:
    printf("\nSprache : Deutsch\n");
    return 2;
    break;
     
    }

    Sa compile mais dès que je rentre 1 ou 2 et que la boucle se termine sa me renvoye un bug de mémoire, par contre tout autre chiffre passe

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 68
    Points : 44
    Points
    44
    Par défaut
    De ce coté la c'est bon, mais comme j'envoyais ce pointure à tous mes sous programmes (int* langue_ch) sa bug de partout, je suis pas sorti de l'auberge...


    Voici le code me mon sous programme mode auquel j'ai donné la valeur de langue_ch. Arrivé au switch il bug.... help?


    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    int mode(char*langue_ch)
    {
     
    int mod_ch;
    int *mod_choisi = &mod_ch;
     
    do{
     
    printf("\ndebug1 =%s",langue_ch);
     
    if (*langue_ch =='1')
                    {
                        printf("\n\nChoississez le mode de jeu\n\n1\tNormal\n2\tContre la montre\n3\tAfficher score\n\n");
                    }
     
                    else
                    {
     
                        printf("\nWahlen Sie das Spielmod\n\n\n1\tNormal\n2\tContre la montre\n3\tAfficher score\n\n");
                    }
     
    scanf("%ld",&mod_ch);
     
     
    }while ((*mod_choisi != 1)&&(*mod_choisi != 2)&&(*mod_choisi != 3));
     
     
    switch (mod_ch){
     
    case 1:
    return 1;
    break;
     
    case 2:
    return 2;
    break;
     
    case 3:
    return 3;
    break;
     
    }
    }
    [edit] tous mes sous programmes bug avec une erreur de lecture mémoire

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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é)
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par K4trix
    Sa compile mais dès que je rentre 1 ou 2 et que la boucle se termine sa me renvoye un bug de mémoire, par contre tout autre chiffre passe
    Ben oui, il ne suffit pas de passer 20 à fgets() pour que ça crée 20 char comme par magie. Le principe est de définir un tableau de char d'une taille raisonnable (pour un caractère, il faut 3 minimum : '1', 0, '\n') :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       char langue_ch[3];
    puis de passer cette taille à fgets()
    fgets(langue_ch,sizeof langue_ch, stdin);

    <...>
    }
    while (*langue_ch != '1' && *langue_ch != '2');
    Pas besoin de pointeur intermédiaire et de toutes ces parenthèses...

    Ton code mis au point (y compris l'orthographe !)
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int langue (void)
    {
       char langue_ch[3];
     
       do
       {
          printf ("\n\nChoississez votre langage\n"
                  "Wahlen Sie die Sprache\n\n\n"
                  "1\tFrancais\n"
                  "2\tDeutsch\n\n");
     
     
          fgets(langue_ch, sizeof langue_ch, stdin);
          printf ("%s", langue_ch);
       }
       while (*langue_ch != '1' && *langue_ch != '2');
     
       switch (*langue_ch)
       {
     
       case '1':
          printf ("\nLangue choisie : Francais\n");
          return 1;
          break;
     
       case '2':
          printf ("\nSprache : Deutsch\n");
          return 2;
          break;
     
       default:
          return -1;
       }
    }
     
    int main (void)
    {
       int lng = langue ();
       printf ("lang = %d\n", lng);
       return 0;
    }
    Pose des questions si tu ne comprends pas...
    Pas de Wi-Fi à la maison : CPL

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 68
    Points : 44
    Points
    44
    Par défaut
    heu le compilateur est alérgique au fait que tu aies mis un 2 ème int main ()dans le programme, sinon j'ai à peu près capté le reste
    [edit] LOL comme je débute^^, c'est tout bon sa marche nikel. me reste plus qu'a supprimer tous les scanf de mon programme et a tout modifier par sa.....

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par K4trix
    heu le compilateur est alérgique au fait que tu aies mis un 2 ème int main ()dans le programme,
    Parce que j'ai posté un code complet qui permet de tester la fonction... Evidemment, tu ne dois prendre que la fonction et l'intégrer dans ton code...

    T'es un grand garçon, non ?
    Pas de Wi-Fi à la maison : CPL

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 68
    Points : 44
    Points
    44
    Par défaut
    oui lol, j'ai corrigé entre temps merci beaucoup

+ 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