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 :

besoin d'aide pour code


Sujet :

C

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1
    Par défaut besoin d'aide pour code
    voici chers amis ;j'ai eu la petite idée de vouloir authentifier celui qui compilera mon code source.
    l'idée était de mettre un nom qui tant que celui ci n'est pas mentionne vous n'avez pas accès au reste du code source .j'ai compile mon code source et a ma grande surprise la boucle recommence toujours la même phrase "a qui ai-je l'honneur" même lorsque délibérément je rentre le mot mao.
    dite moi comment faire pour que lorsque je rentre le mot mao , je puisse avoir accès au reste du code .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
    #include <stdlib.h>
     
       void main()
    {
     
        char admin[3+1]="mao";
         do
        {printf("a qui ai-je l'honneur?\n");
        scanf("%s",admin);
        }
        while(admin!="mao");
    }

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 502
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Ce n'est pas ainsi qu'on compare deux chaines !

    Si ton compilateur ne te dit rien, c'est surement parce que tu n'as pas activé les bons warnings :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    gcc authentification.c -Wall -Wextra
    authentification.c: In function ‘main’:
    authentification.c:14:13: warning: comparison with string literal results in unspecified behavior [-Waddress]
    Voici le code que j'ai compilé :
    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
    $ more authentification.c 
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
     
    	char admin[3+1]="mao";
    	do
    	{
    		printf("a qui ai-je l'honneur?\n");
    		scanf("%s",admin);
    		printf("Lu : '%s'", admin);
    	}
    	while(admin!="mao");
     
    	return 0;
    }
    Il faut être prudent avec scanf, comme le montre l'affichage suivant en cas d'espace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ ./a.out 
    a qui ai-je l'honneur?
    mao
    Lu : 'mao'a qui ai-je l'honneur?
    jean jacques hoarau
    Lu : 'jean'a qui ai-je l'honneur?
    Lu : 'jacques'a qui ai-je l'honneur?
    Lu : 'hoarau'a qui ai-je l'honneur?
    De plus (ce n'est pas arrivé là), il y a certainement un risque que ta chaine admin ne soit pas assez longue et que scanf génère une erreur de segmentation.

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    On peut résoudre ce problème avec :

    scanf va lire 10 caractère qui ne sont pas des retours à la ligne.
    Après, si la ligne est trop grosse, on doit pouvoir vider l'entrée standard mais je ne sais plus comment.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 19
    Par défaut
    Je peux me tromper, mais pour vider l'entrée standard, ce n'est pas ?
    Et pour le problème concernant les quotes, on peut peut-être le dé-spécialiser avec un \' ?

    Ca ne répond pas vraiment à la problématique, mais si ça peut aider...

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 502
    Billets dans le blog
    1
    Par défaut
    @Neckara : on peut ruser ainsi.

    @Vrashnak :

    Non : http://c.developpez.com/faq/index.ph...S_fflush_stdin
    C'est un problème récurrent en C, il faut être au courant de ce point.
    Tu peux aussi lire cette discussion : http://www.developpez.net/forums/d76...s/#post6685910

    De quel problème avec les quotes parles-tu ? : /

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 19
    Par défaut
    @Bktero : d'accord, désolé pour le fflush. On l'avait vu en cours sur le stdout, j'ai donc bêtement pensé que ça pouvait s'appliquer sur le stdin.
    Pour les quotes, j'ai eu l'impression qu'il y avait un problème suite à ton message de 18h22, mais en fait, j'ai juste oublié de réfléchir avant de parler.
    En tous cas, merci pour l'info sur le fflush.

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 502
    Billets dans le blog
    1
    Par défaut
    Fflush(stdin) marche en général sous Windows. Je l'ai d'ailleurs largement utilisé en TP de C, lors de mes études, sans que mes profs nous disent de faire attention à cette fonction. Ca ne m'étonne donc pas que tu aies pu faire l'erreur, l'utilisation de cette fonction est mal expliqué. Obsidian l'explique très bien ici (si tu as suivi mes précédents liens, tu l'as déjà lu ^^) et m'a permis de vraiment comprendre le pourquoi du comment

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 875
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Vrashnak Voir le message
    @Bktero : d'accord, désolé pour le fflush. On l'avait vu en cours sur le stdout, j'ai donc bêtement pensé que ça pouvait s'appliquer sur le stdin.
    Salut
    C'est en effet compréhensible. Mais il est surtout nécessaire de comprendre pourquoi tu veux vider le clavier.
    Si tu veux le vider, c'est qu'il y a des caractères. Mais à la base, ces caractères c'est toi qui les as mis.
    Donc pourquoi n'ont-ils pas été traités ? Parce que la fonction dédiée à la récupération de ces caractères n'a pas tout récupéré. Pourquoi n'a-t-elle pas tout récupéré ? Parce qu'elle s'est arrêté à un moment. Et où s'est-elle arrêté ? A l'espace (comme le montre l'exemple de Bktero)
    Donc conclusion: soit tu ne rentres pas d'espace, soit tu utilises une fonction qui ne s'arrête pas aux espaces (comme par exemple fgets(buffer, taille, stdin)).
    Ainsi, pas de caractère parasite => pas besoin de fflush.

    Tu auras aussi le même problème si tu fais saisir, via scanf, un nombre puis une chaine. En saisissant le nombre tu valideras par <return> mais ce <return> ne sera pas récupéré par le scanf("%d") donc restera dans stdin et sera ensuite récupéré lors du scanf suivant destiné à saisir la chaine.
    Et de façon plus générale, tu verras qu'en fait on n'utilise jamais scanf() pour faire saisir des trucs car scanf() est fait pour des entrées formatées et que ce que tu tapes au clavier est tout sauf formaté. Malheureusement quand on débute on a rapidement besoin, pour les TP, de faire saisir des valeurs et, pour simplifier, on passe par scanf()...

    Citation Envoyé par Bktero Voir le message
    Je l'ai d'ailleurs largement utilisé en TP de C, lors de mes études

    Citation Envoyé par Bktero Voir le message
    ...sans que mes profs nous disent de faire attention à cette fonction.
    Il y a "prof" et "prof". Ou, de façon moins sarcastique, il est naturel que les profs (n'ayant pas que ça à faire) n'aient pas forcément le temps d'étudier toutes les subtilités et de disséquer les méandres du langage et donc aient pris la mauvaise habitude de laisser passer fflush(stdin) sans même le voir (voire même aient l'habitude de faire la même chose). Surtout que l'informatique étant quand-même une science jeune, certains profs ont été bombardés "prof d'informatique" juste parce qu'ils savaient mieux utiliser MsWord que leurs collègues...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 413
    Par défaut
    Pour moi, un prof qui enseigne scanf("%s") aux débutants, c'est comme un prof qui enseigne gets(): C'est un mauvais prof.

    Au passage, ce n'est pas le seul problème de ton code: Le second problème est qu'on ne peut pas comparer deux chaînes de caractères avec == ou !=. Il faut utiliser la fonction strcmp(), déclarée dans string.h, qui retourne zéro quand les deux chaînes sont égales.

    Note aussi que la comparaison de chaînes en C est sensible à la casse. Si tu veux ignorer la casse tout en restant portable, c'est possible mais pas évident.Franchement, la comparaison de chaînes en C est une des choses pour lesquelles je ne regrette pas d'être passé 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.

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 875
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pour moi, un prof qui enseigne scanf("%s") aux débutants, c'est comme un prof qui enseigne gets(): C'est un mauvais prof.
    Pas forcément. Si tu examines bien le mécanisme d'apprentissage de l'être humain, tu verras qu'il apprend toujours par pallier mais que chaque accession au pallier supérieur ne peut se faire qu'en détruisant ce qui a été appris au pallier précédent car devenu inexact en approfondissant.
    Regarde par exemple le petit enfant. Il voit le soleil tourner autour de la Terre et effectivement, lui répond-on, le soleil tourne. Plus tard, il apprend qu'en fait le soleil est immobile mais que c'est la Terre qui tourne autour de lui. Puis il apprend les nombres naturels et les radicaux qui ne s'appliquent qu'aux positifs parce qu'il a appris que - * - = +. Puis plus tard, on lui apprend les complexes qui ont une partie imaginaire qui vaut -1 quand on l'élève au carré. Puis il apprend la physique où on lui représente les atomes comme de petites billes. Puis plus tard, il devient chercheur en théorie quantique et apprend qu'en fait les atomes ne sont que des probabilités.
    Ainsi, chaque pallier, faux dans l'absolu mais suffisamment représentatif de ce qu'on voit et suffisamment assimilable pour aider à comprendre ; sert de support pour évoluer vers la compréhension du niveau suivant.
    Il en va de même pour le C. Le débutant à qui il manque beaucoup de notions a besoin, pour faire ses premiers TP, d'une méthode de saisie. scanf() répond à ce besoin initial. Plus tard, il ara suffisamment acquis/compris/manipulé pour qu'on lui "désapprenne" scanf() afin de le remplacer par autre chose...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pour moi, un prof qui enseigne scanf("%s") aux débutants, c'est comme un prof qui enseigne gets(): C'est un mauvais prof.
    Les gens qui débarquent sur les forums de programmation à coup de scanf ne suivent vraisemblablement pas de cours depuis très longtemps. Expliquer les mécanismes sous-jacents à fgets (notion de flux, notamment), n'est pas spécialement compréhensible. Sans compter que la lecture robuste de nombres nécessite des appels supplémentaires (typiquement, strtol), pas forcément très simples à expliquer. Après, je ne cautionne pas l'utilisation de scanf pour les entrées humaines.

    Citation Envoyé par Médinoc Voir le message
    Note aussi que la comparaison de chaînes en C est sensible à la casse. Si tu veux ignorer la casse tout en restant portable, c'est possible mais pas évident.
    Côté portabilité relative, strcasecmp est POSIX. Sinon, histoire de réinventer la roue, deux appels à tolower, et le tour est joué (pour le coup, ça fait deux accès mémoires supplémentaires, sans compter que la table de masquage utilisée par tolower devrait finir dans le cache).

    Citation Envoyé par Médinoc Voir le message
    Franchement, la comparaison de chaînes en C est une des choses pour lesquelles je ne regrette pas d'être passé au C#.
    Je dirais même : le support des chaînes de caractères (quoique je connaisse peu le C#).
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

Discussions similaires

  1. [WB17] Besoin d'aide pour code sur requête et zone répétée
    Par newbieWeb dans le forum WebDev
    Réponses: 2
    Dernier message: 23/05/2015, 11h38
  2. [WD11] Besoin d'aide pour code (Image)
    Par gabcouts dans le forum WinDev
    Réponses: 5
    Dernier message: 09/07/2010, 21h24
  3. connexion ado avec acces et besoin d'aide pour code vb svp
    Par essse dans le forum Visual Studio
    Réponses: 0
    Dernier message: 06/03/2009, 09h57
  4. Je besoin d'aide pour terminer mon code
    Par Paulinho dans le forum C++
    Réponses: 7
    Dernier message: 06/11/2005, 23h30

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