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

Linux Discussion :

comment sécuriser la saisie en C avec scanf?


Sujet :

Linux

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 17
    Points : 23
    Points
    23
    Par défaut comment sécuriser la saisie en C avec scanf?
    Salut,

    Avec scanf,une saisie incorrecte (une chaine de cararctère ou d'un entier quand j'ai besoin d'un caractère) fait entrer le programme en boucle infinie.
    pour cela , pourrez-vous me donner la solution la plus simple pour ce problème?

    et merci .

  2. #2
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Tu vérifies le retour de la fonction scanf ? Elle t'indique si elle a réussie à parser la ligne.

    Il semble quand même que tout le monde déconseille l'utilisation de scanf. Tu as d'autres alternatives (plus lourdes à mettre en oeuvre) avec les strtol, strtod etc. Pour les utiliser tu découpes ta chaîne et tu traites chaque morceau avec ces fonctions.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bouraouimed Voir le message
    Salut,

    Avec scanf,une saisie incorrecte (une chaine de cararctère ou d'un entier quand j'ai besoin d'un caractère) fait entrer le programme en boucle infinie.
    pour cela , pourrez-vous me donner la solution la plus simple pour ce problème?

    et merci .
    Déjà il y a une rubrique spécifique C dans ce forum.

    Le problème de scanf c'est qu'il attend une chaine formatée et que l'utilisateur, lui, tape n'importe quoi. Et tout ce qui ne correspond pas à l'élément attendu reste alors dans le buffer clavier (stdin) et ça bloque ensuite les saisies suivantes.
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    int main()
    {
        int age;
        char nom[255];
     
        printf("Entrez votre age\n");
        scanf("%d", &age);
     
        printf("Entrez votre nom\n");
        scanf("%s", nom);
     
        printf("Nom: [%s] - Age: [%d]\n", nom, age);
    }
    Ce simple code ne fonctionnera pas comme tu t'y attends car le scanf("%d") ne récupèrera pas le <retour chariot> tapé lors de la saisie de l'age. Celui-ci reste donc dans le buffer stdin et il est ensuite récupéré par le scanf suivant. Et donc tu peux jamais saisir le nom

    La procédure standard est la suivante
    1) faire saisir une chaine avec fgets()
    2) extraire ce qui t'intéresse de la chaine avec sscanf
    3) si sscanf ne renvoie pas le bon nombre d'éléments récupérés, alors erreur de saisie

    Exemple

    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
    #include <stdio.h>
    int main()
    {
        char saisie[255];
        int age;
        char nom[255];
     
        while(1)
        {
            printf("Entrez votre age\n");
            fgets(saisie, 255, stdin);
            if (sscanf(saisie, "%d", &age) == 1) break;
            printf("Erreur - Saisie incorrecte - Recommencez...\n"); 
        }
     
        printf("Entrez votre nom\n");
        fgets(nom, 255, stdin);
        printf("Nom: [%s] - Age: [%d]\n", nom, age);
    }
    Dans ce cas, le fgets récupère tout ce qu'il y a dans le clavier. Celui-ci reste donc clean pour la saisie suivante. Ensuite c'est sscanf qui informe d'un problème éventuel. Et cette façon de faire peut facilement être adaptée aux doubles...
    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]

  4. #4
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 17
    Points : 23
    Points
    23
    Par défaut
    il reste un seul petit problème dans le test de saisie.
    c'est que par exemple,j'accepte dans mon programme la touche n pour une nouvelle partie
    mais en tapant "njzghigze..." cette saisie sera accepté et on entre ds une nouvelle partie ,alors quelle est la slution s'il vous plait?

    et merci.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bouraouimed Voir le message
    il reste un seul petit problème dans le test de saisie.
    c'est que par exemple,j'accepte dans mon programme la touche n pour une nouvelle partie
    mais en tapant "njzghigze..." cette saisie sera accepté et on entre ds une nouvelle partie ,alors quelle est la slution s'il vous plait?

    et merci.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while(1)
    {
            printf("Entrez n pour une nouvelle partie?\n");
            fgets(saisie, 255, stdin);
            if (strcmp(saisie, "n\n") == 0) break;
            printf("Erreur - Saisie incorrecte - Recommencez...\n"); 
    }
    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]

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/03/2011, 16h54
  2. controle de saisie avec scanf
    Par router_ dans le forum C
    Réponses: 9
    Dernier message: 30/06/2010, 20h15
  3. Réponses: 9
    Dernier message: 05/06/2009, 09h26
  4. Réponses: 2
    Dernier message: 07/11/2008, 16h34
  5. Comment sécuriser un fil RSS avec authentification ?
    Par kryogen dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 10/07/2007, 16h53

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