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 :

formatage dans un sscanf


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par défaut formatage dans un sscanf
    Bonjour,

    je suis a la recherche d'un bug dans un petit programme C écrit par quelqu'un d'autre il y a plusieurs années (et qui est bien entendu injoignable maintenant).

    voici une portion du code contenant un sscanf qui me pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
          for(;;)
          {
    	   if (gets(line) == NULL)
    	      break ;
    	   res = sscanf(line, " with %[^ \t;]", package) ; 
               .......
    1- me parlez pas du for(;;) et du break, j'en ai déjà les cheveux blancs (y a aussi des continue plus loin )
    2- mon problème se situe sur la signification du %[^ \t;] : est-ce que ça signifie que dans package j'aurai tout ce qui suit " with " et qui n'est pas espace, tab ou ";" ?
    3- si je n'ai pas d'espace avant le with dans le fichier lu est ce que j'aurai quand même ce qui suit le with dans la variable package ?

    merci d'avance pour vos reponses

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par straasha Voir le message
    1- me parlez pas du for(;;) et du break, j'en ai déjà les cheveux blancs (y a aussi des continue plus loin )


    Qu'est-ce que te chagrine là-dedans ??

    Ce n'est qu'une boucle infinie, pour laquelle vraisemblablement il y a plusieurs conditions d'arrêts, et qu'il est donc plus simple d'écrire ça que d'écrire

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ( (conditoin1) && (conditon2) && ... )
    {
    }

  3. #3
    Membre chevronné Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Qu'est-ce que te chagrine là-dedans ??
    c'est juste que c'est pas joli et vu le reste du code un while aurait été plus clair, maintenant j'ai pas dit que ce n’était pas correct (comme on dit : ça compile donc c'est valide )
    mon problème se situe plutôt sur le sscanf.

  4. #4
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Je pense que tu trouveras ta reponse dans ce tres bon tutoriel sur les fonctions de type scanf : http://xrenault.developpez.com/tutoriels/c/scanf/

    Desole de ne pas te fournir la reponse exacte, mais je n'ai pas utilise ces fonctions depuis un certain temps, et crains de dire des betises.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par straasha Voir le message
    c'est juste que c'est pas joli et vu le reste du code un while aurait été plus clair, maintenant j'ai pas dit que ce n’était pas correct (comme on dit : ça compile donc c'est valide )
    mon problème se situe plutôt sur le sscanf.
    ce n'est pas l'utilisation d'un for (; qui est pas jolie...

    C'est l'utilisation couplée à l'instruction suivante...

    Disons qu'une solution normale et élégante est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ( fgets (...) != NULL )
    {
    }

  6. #6
    Membre chevronné Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Disons qu'une solution normale et élégante est :...
    tout à fait d'accord mais mon code est en conf clearcase liée a des fiches clearquest et j'evolue dans un milieu où chaque potentielle modif doit être justifiée, discutée, relue, testée, validée et ce par des personnes différentes (normalement) pour chaque étapes alors je doute qu'on m'autorise à modifier du code qui marche juste parce qu'il est pas joli.

    Jeroman :
    merci pour ta réponse c'est la confirmation que j'attendais, j'aurai quand même besoin d'une précision : pour les espaces avant et après le with est ce que ça marchera pareil si j'ai plusieurs espaces (ou aucun) dans le fichier lu ? et si j'ai une (ou plusieurs) tabulation(s) ?

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    tout à fait d'accord mais mon code est en conf clearcase liée a des fiches clearquest et j'evolue dans un milieu où chaque potentielle modif doit être justifiée, discutée, relue, testée, validée et ce par des personnes différentes (normalement) pour chaque étapes alors je doute qu'on m'autorise à modifier du code qui marche juste parce qu'il est pas joli.
    Le problème dépasse le cadre joli ou pas joli. La fonction gets a une faille de sécurité très grave, car elle permet à l'utilisateur de faire déborder le tampon. Ceci peut, dans le meilleur des cas, faire simplement crasher l'application, voire la faire bugguer (vu qu'on modifie la pile, cela peut modifier d'autres variables locales) et dans le pire des cas faire exécuter du code arbitraire, avec par conséquent tous les problèmes de sécurité que cela comporte. Exploiter une telle faille est difficile et souvent hasardeux, mais cela reste possible.

    Jeroman :
    merci pour ta réponse c'est la confirmation que j'attendais, j'aurai quand même besoin d'une précision : pour les espaces avant et après le with est ce que ça marchera pareil si j'ai plusieurs espaces (ou aucun) dans le fichier lu ? et si j'ai une (ou plusieurs) tabulation(s) ?
    Oui, un espace avant permet de zapper un ou plusieurs caractères blancs (espace, tabulation, etc), s'il y en a.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	char line[] = "  \t   with mach\tin"; /* plusieurs caractères blancs avant "with" */
    	res = sscanf(line, " with %[^ \t;]", package) ;
    package sera rempli par "mach".
    Tu auras le même résultat avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	char line[] = "with mach\tin"; /* aucun caractère blanc avant "with" */
    Par contre ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	char line[] = "   \t  with mach\tin";
    	res = sscanf(line, "with %[^ \t;]", package) ;
    fera échouer sscanf.

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res = sscanf(line, " with %[^ \t;]", package) ;
    Si la chaine contient d'éventuels caractères blancs (d'où l'espace avant le "with"), suivis du mot "with" puis d'éventuels caractères blancs (à cause de la présence d'un espace avant le %), tout ce qui suit sera copié dans le tableau package jusqu'à ce qu'un espace, une tabulation ou un point-virgule soit rencontré.

    Par exemple, si line contient " with mach;in" (sans les guillemets), res aura 1 pour valeur et package contiendra "mach\0" (sans les guillemets).

    Concernant , il n'y a rien de compliqué, c'est juste une boucle infinie. break provoque la sortie de la boucle et continue fait revenir en début de boucle.

    Par contre, je te conseille fortement d'utiliser fgets au lieu de gets, car c'est une fonction dangereuse (il y a une faille de sécurité très grave).

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

Discussions similaires

  1. insérer un mot sans formatage dans un texte formaté
    Par happyculteur dans le forum VBScript
    Réponses: 2
    Dernier message: 19/11/2007, 17h22
  2. Formatage dans Tableaux Dynamique
    Par adrien.gendre dans le forum Excel
    Réponses: 2
    Dernier message: 09/08/2007, 14h04
  3. Formatage dans Excel
    Par nmathon dans le forum Delphi
    Réponses: 1
    Dernier message: 15/02/2007, 17h54
  4. [VBA-W] Garder le formatage dans un TextBox
    Par Blackfox dans le forum VBA Word
    Réponses: 5
    Dernier message: 06/11/2006, 12h30
  5. Problème formatage dans balise title / alt
    Par jflebegue dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 09/12/2004, 15h18

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