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 :

vider une partie du buffer pour l'utilisation de fscanf (fscanf securisé)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 59
    Par défaut vider une partie du buffer pour l'utilisation de fscanf (fscanf securisé)
    Bonjour à tous!
    Alors j'ai une petite question sur l'utilisation de fscanf (et globalement sur toute cette famille de fonction)

    Supposons que j'ai un fichier contenant un texte formaté comme suit:
    (string) (string) (int)
    bidul truc 20

    Je veux récupérer à l'aide de la fonction fscanf: bidul truc et 20.

    Mais supposons que la taille de mon tableau permettant de recevoir la première chaine de caractère soit de 3.
    Alors j'utilise bien sur "%2s",comme ça, je ne produirais pas d'overflow!
    Cependant, je veux que le deuxième tableau contienne truc. Or je m'aperçois qu'en faite il contient dultruc: le dul venant de la première chaine de caractère (car le buffer contient ces lettres!)

    J'aimerai savoir comment forcer fscanf à lire les 2 premières lettres de bidul, d'"oublier" les lettres dul (pour ne pas faire d'overflow), et de continuer son fonctionnement normal, c'est à dire de mettre la deuxième chaine de caractère "truc" dans la variable dédiée...

    Alors je pense qu'on va me conseiller d'utiliser un getchar()! Oui, mais je ne veux pas: j'aimerais faire ça uniquement avec fscanf: c'est juste dans le but d'apprendre!!!
    Je sais aussi que %* permet "d'oublier" les caractères: oui, mais moi je veux juste oublier dul, pas toute la chaine!!

    Pourrais-t-on m'expliquer comment faire?
    Par avance merci!!

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Tu es sûr que ce n'est pas « scanf() » plutôt que « fprintf() », que tu utilises ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 59
    Par défaut
    Oh ZUT: tellement l'habitude d'écrire ça!
    je vais corriger mon post! mais oui, c'est fscanf!!!

    Méga désole pour cette erreur stupide!

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Tu peux faire suivre ton « %s » par un opérateur d'affectation-suppression « * », qui permet de lire normalement un élément puis de le faire passer à la trappe plutôt que de le stocker derrière le pointeur correspondant. Ainsi :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
        scanf ("%10s%*s %10s%*s",str1,str2);

    … lira une chaîne de dix octets maximum puis ignorera la suite jusqu'au blanc, avant de recommencer.

    L'inconvénient, c'est que si l'élément à lire est moins long que la taille passée, alors l'opérateur en question va faire disparaître la chaîne suivante. Ce n'est donc pas une solution parfaite.

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       char tab1[8], tab2[8];
       int d;
       scanf("%7s%*[^ ]%7s%*[^ ]%d",tab1, tab2,&d);
    devrait traiter correctement chaque champ en les limitant à 7 caractères (+ le '\0' terminal) maximum.

    [EDIT] Cette solution est incorrecte

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 59
    Par défaut
    Super merci!
    Dès que je pourrais, j'essaierai ce code!

    Est-ce qu'on peut considérer ce code comme sécurisé? Dans le sens ou par exemple, on ne peux pas faire d'overflow?

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/03/2014, 15h17
  2. mettre une partie de buffer à 0
    Par madmax51 dans le forum Débuter
    Réponses: 20
    Dernier message: 04/06/2010, 08h53
  3. Réponses: 6
    Dernier message: 26/11/2009, 15h19
  4. memcpy, memmove etc. d'une partie du buffer
    Par muquet dans le forum Débuter
    Réponses: 5
    Dernier message: 19/07/2007, 17h49

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