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 :

Comparaisons entres variables dont l'une renseignée par scanf_s


Sujet :

C

  1. #1
    Membre régulier

    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations forums :
    Inscription : Juin 2011
    Messages : 81
    Points : 89
    Points
    89
    Billets dans le blog
    2
    Par défaut Comparaisons entres variables dont l'une renseignée par scanf_s
    Bonjour,

    Un livre propose l'exercice suivant :
    Code c : 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
    /*Exercice 11
    Un personnage arrive devant une porte. Un gardien est devant l’entrée. Il pose une question
    au personnage. Si le personnage donne la bonne réponse il peut passer, sinon il est détruit.
    Faire un programme qui traduise cette situation en langage C.
    */
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    int main()
    {
    int question, reponse;
     
        srand(time(NULL)); // remplacé par : srand((unsigned int) time(NULL));
        printf("le cerbère pose une question ... et\n");
        question = 'a'+rand()%3; // pour a, b ou c
    	printf_s("question contient : %c\n", question); // ajouté pour contrôle
     
        printf("le personnage a le choix entre les reponses a, b, c : ");
        scanf("%c",&reponse); // scanf_s utilisé 
    	printf_s("reponse contient : %c\n", reponse); // ajouté pour contrôle
     
        if (reponse==question)
            printf("vous avez la vie sauve\n");
        else
            printf("vous allez etre detruit\n");
    	return 0;
    }
    Or la console renvoie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    le cerbÞre pose une question ... et
    question contient : c
    le personnage a le choix entre les reponses a, b, c : b
    reponse contient :
    vous allez etre detruit
    Appuyez sur une touche pour continuer...
    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    le cerbÞre pose une question ... et
    question contient : b
    le personnage a le choix entre les reponses a, b, c : 42
    reponse contient :
    vous allez etre detruit
    Appuyez sur une touche pour continuer...
    Ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    le cerbÞre pose une question ... et
    question contient : c
    le personnage a le choix entre les reponses a, b, c : c
    reponse contient :
    vous allez etre detruit
    Appuyez sur une touche pour continuer...
    ou, en utilisant scanf plutôt que scanf_s
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    le cerbÞre pose une question ... et
    question contient : b
    le personnage a le choix entre les reponses a, b, c : b
    reponse contient : b
    vous allez etre detruit
    Appuyez sur une touche pour continuer...
    Est-il possible de faire correspondre ces deux variables question et reponse, de manière à avoir "la vie sauve" ?

    EDI / compilateur : VSE2013 pour Windows 8.1 x64.

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    scanf("%c") bosse sur des char, non des int. J'ai une présomption comme quoi ça pourrait être un octet de poids fort non-initialisé. Initialise tes entiers explicitement à zéro lors de leur déclaration, il y a une chance que ça change des choses.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre régulier

    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations forums :
    Inscription : Juin 2011
    Messages : 81
    Points : 89
    Points
    89
    Billets dans le blog
    2
    Par défaut
    Merci, d'ailleurs l'auteur en parle plus en amont, pour une variable de type int, la valeur de la lettre n'est stockée que sur le premier octet. Je viens de m'en rendre compte car il fait la même 'erreur' pour illustrer le switch.
    Mais dans le cas de l'exercice, le problème est double avec VSE2013 : il faut également utiliser scanf et non scanf_s pour que cela fonctionne.
    Existe-t-il malgré tout un moyen pour que cela fonctionne avec scanf_s ?

    Aussi, est-il possible que l'auteur du livre compile pour du .cc et que dans ce cas, cela fonctionne ?
    Édit : non, même en .cc il est nécessaire d'initialiser la variable à zéro ou d'opter pour un type char. De même, scanf_s ne fonctionne pas pour ce genre d'instruction.

    Merci

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    scanf_s() exige un paramètre supplémentaire indiquant la taille du buffer aussi bien pour %c que pour %s, malgré le fait que %c sans taille dans le format signifie un seul caractère.

    scanf_s("%c", &reponse, 1) devrait marcher.

    Note également qu'invoquer scanf("%c") sur un int est (85.7% sûr) un comportement indéfini, notamment parce qu'il n'aura pas le même effet entre une architecture big-endian et une architecture little-endian. Tu devrais utiliser des char, c'est fait pour ça.

    Ou si tu veux utiliser des int, utilise getchar() au lieu de scanf("%c").
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre régulier

    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations forums :
    Inscription : Juin 2011
    Messages : 81
    Points : 89
    Points
    89
    Billets dans le blog
    2
    Par défaut
    Merci pour ces précisions concernant la gestion de la mémoire tampon pour scanf_s
    Dommage qu'il n'en soit pas fait mention dans le livre.
    Peut être sont elles trop spécifiques.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Déjà, je suis surpris qu'un livre mentionne scanf_s(), étant donné que c'est une extension non-standard de Microsoft (du temps où ils s'intéressaient encore au C).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre régulier

    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations forums :
    Inscription : Juin 2011
    Messages : 81
    Points : 89
    Points
    89
    Billets dans le blog
    2
    Par défaut
    Le livre en parle pour évoquer l'exception du compilateur de Microsoft. Celui-ci demande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define _CRT_SECURE_NO_DEPRECATE
    pour accepter ce scanf() dépourvu de sécurité. Pour une meilleure portabilité, je me passerai donc de scanf_s() ��.

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

Discussions similaires

  1. comparaison entre le contenu d'une variable et un string
    Par merry marie dans le forum Langage
    Réponses: 14
    Dernier message: 21/01/2013, 10h46
  2. Réponses: 1
    Dernier message: 24/01/2008, 09h13
  3. comparaison entre variable et type
    Par mask91 dans le forum C
    Réponses: 8
    Dernier message: 11/02/2007, 00h35
  4. Comparaison entre deux dates dans une table
    Par Biskot75 dans le forum Access
    Réponses: 6
    Dernier message: 19/09/2006, 11h16
  5. Réponses: 6
    Dernier message: 18/04/2006, 13h11

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