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 :

sscanf et condition


Sujet :

C

  1. #1
    Membre averti Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Points : 386
    Points
    386
    Par défaut sscanf et condition
    Bonjour les gars

    Alors voilà j'ai un problème, je programme un bot irc en ce moment mais il y a un truc que je ne comprend pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /*recv  & parse(buffer);...*/
    /*disant que la commande du user se trouve dans char *cmd*/
    if (sscanf (cmd, "!qaddl %s", &texte)) printf ("je suis dans la condition");
    else printf ("je ne suis pas dans la condition");
    Ceci fonctionne correctement MAIS si j'envoi la commande: "!qadd" seulement ça entre quand même dans la condition et j'ai une erreur de segmentation ...

    Pourquoi est-ce que la condition est satisfaite ?

    Merci
    Compil your life guy!
    The Aures Project

  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
    1. [s]scanf("%s"), c'est le mal. Tu dois limiter la taille ([s]scanf("%10s") par exemple).
    2. Quel est le type de texte ? Généralement, on ne met pas de & pour un %s. Si texte est un tableau de caractères, ça passe, mais dans le cas d'un pointeur, c'est le comportement indéfini (généralement un crash) assuré.
    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 averti Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Points : 386
    Points
    386
    Par défaut
    Médinoc c'est bien un tableau de caractères le texte.
    Compil your life guy!
    The Aures Project

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Goundy
    if (sscanf (cmd, "!qaddl %s", &texte)) printf ("je suis dans la condition");
    else printf ("je ne suis pas dans la condition");[/code]
    Ceci fonctionne correctement MAIS si j'envoi la commande: "!qadd" seulement ça entre quand même dans la condition et j'ai une erreur de segmentation ...

    Pourquoi est-ce que la condition est satisfaite ?
    Ton test n'est pas assez précis. sscanf() renvoi le nombre de conversions réussies. C'est donc '==1' qu'il faut tester et non '!= 0'...

    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
    20
    #include <stdio.h>
     
    int main (void)
    {
    #if 0
       char const *cmd = "!qaddl xxx";
    #else
       char const *cmd = "!qaddl";
    #endif
       char texte[32] = "";
       int n = sscanf (cmd, "!qaddl %s", texte);
     
       printf ("n = %d\n", n);
       if (n == 1)
          printf ("je suis dans la condition : '%31s'\n", texte);
       else
          printf ("je ne suis pas dans la condition\n");
     
       return 0;
    }
    Il faut apprendre à écrire du code de test... tu n'es plus un débutant depuis le temps...
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre averti Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Points : 386
    Points
    386
    Par défaut
    Merci beaucoup
    Je crois que je dorénavant je vais mieux utiliser sscanf
    Merci encore les gars
    Compil your life guy!
    The Aures Project

  6. #6
    Membre averti Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Points : 386
    Points
    386
    Par défaut
    Re !
    Désolé pour le double post, j'ai une autre question :/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int x = sscanf (cmd, "!addl %s", texte);
    Si cmd contient "!qaddl" seulement x est quand même = à 1
    Comment ça se fait si aucune conversion ne peut avoir lieu? j'avoue que je suis paumé

    voilà ma partie 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
    14
    15
    16
     
    #define		_QADDL	"!qadd %[^\n]"
     
    if (sscanf (ptr, _QADDL, quote)==1){
    						printf ("strlen(%d)", strlen(quote));
    						xx = strchr(ptr, ' ') + 1;
    						settozero (quote);
    						strcpy (quote, xx);
    						/* add a single line */
    						gard = add_quote (quote, nik);
    							if (gard != 0){
    								logit ("mysql error\n");
     
    							}
    						print ("added: %s\n", quote);
    					}
    Oubliez j'ai trouvé mon erreur :/
    Merci
    Compil your life guy!
    The Aures Project

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 31/07/2008, 20h09
  2. Condition sur debug et release
    Par xave dans le forum MFC
    Réponses: 3
    Dernier message: 04/02/2004, 15h04
  3. Condition et contenu TImage
    Par Detlev_linux dans le forum Langage
    Réponses: 6
    Dernier message: 23/12/2003, 01h00
  4. Réponses: 4
    Dernier message: 12/09/2003, 11h38
  5. boucle avec condition d'arret changeante
    Par NicoH dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2003, 11h48

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