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

  1. #1
    Candidat au Club
    Utilisation regex dans scanf - difficulté avec les quantités -
    Bonjour,

    Je travaille actuellement sur un petit programme en C sous Linux dans lequel je souhaite récupérer certains champs d'une ligne du fichier group.

    Exemple de ligne :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    openoffice<img src="images/smilies/icon_exclaim.gif" border="0" alt="" title=":!:" class="inlineimg" />1007:user1,user2


    Je souhaite récupérer le nom du groupe et le gid.

    Jusque là je m'en sortais à l'aide d'un scanf tel que celui-ci :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    sscanf(ligne_a_analyser,"%50[^:]:%*[^:]:%50[^:]",groupe,gid);


    Mais... le second champ de certaines lignes du fichier group peut être vide. La ligne devient alors :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    openoffice::1007:user1,user2


    Dans cette configuration, le scanf indiqué ci-dessus ne fonctionne plus. J'ai bien compris qu'il fallait indiquer pour ce second champs une notion de quantité (zéro ou plus) mais je ne parviens pas à l'utiliser.

    Quelqu'un pourrait-il m'aider à réaliser cette expression ?


    Merci par avance.

    Cordialement,
    LN.

  2. #2
    Modérateur

    Citation Envoyé par ldnikon Voir le message
    Bonjour,

    Je travaille actuellement sur un petit programme en C sous Linux dans lequel je souhaite récupérer certains champs d'une ligne du fichier group.

    Exemple de ligne :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    openoffice<img src="images/smilies/icon_exclaim.gif" border="0" alt="" title=":!:" class="inlineimg" />1007:user1,user2


    Je souhaite récupérer le nom du groupe et le gid.
    Il y a des fonctions UNIX standard pour récupérer les infos de ces principaux fichiers. En l'occurence, c'est getgrnam() et getgrgid().

  3. #3
    Candidat au Club
    merci
    Merci de cette info je ne savais pas que cela était possible. Je vais réaliser quelques recherches sur ce sujet. Cela devrait me permettre de répondre à mes besoins.

    Ceci étant, juste pour ma culture personnelle, quelqu'un sait-il de quelle façon je peux écrire mon expression dans le cas exposé ?

    Encore merci de ta réponse qui me sera très utile.

    Cordialement,

  4. #4
    Membre éclairé
    Le symbole posix pour "1 ou 0" est normalement "?"

    Pour les fonctions, il est également possible d'utiliser la commande cut pour séparer les différents champs de chaque ligne.

  5. #5
    Membre éprouvé
    Dans ce genre de situation le mieux reste toujours une fonction faite maison.
    Si tu tiens à utiliser sscanf(), tu peux faire des appels successifs pour lire les champs un à un, tout en testant le retour de sscanf(), mais c'est un peu lourd.
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  6. #6
    Expert éminent sénior
    Je ne vois pas pourquoi ce sscanf()
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    sscanf(ligne_a_analyser,"%50[^:]:%*[^:]:%50[^:]",groupe,gid);

    qui marche pour
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    openoffice<img src="images/smilies/icon_exclaim.gif" border="0" alt="" title=":!:" class="inlineimg" />1007:user1,user2

    ne marcherait pas pour
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    openoffice::1007:user1,user2
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  7. #7
    Modérateur

    Citation Envoyé par ldnikon Voir le message
    Ceci étant, juste pour ma culture personnelle, quelqu'un sait-il de quelle façon je peux écrire mon expression dans le cas exposé ?
    Citation Envoyé par diogene Voir le message
    Je ne vois pas pourquoi ce sscanf() qui marche pour
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    openoffice<img src="images/smilies/icon_exclaim.gif" border="0" alt="" title=":!:" class="inlineimg" />1007:user1,user2
    ne marcherait pas pour
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    openoffice::1007:user1,user2
    Comme dit plus haut, le scanf() doit fonctionner.

    Sinon, tu peux utiliser strtok() pour découper ta chaîne en morceaux séparés par un caractère donné (ici, le « : »). C'est ce qu'il y aurait de plus indiqué, je crois.

    Après, tu peux rédiger une vraie expression régulière : man regex.

  8. #8
    Candidat au Club
    strtok()
    Bonjour à tous,

    Tout d'abord merci de votre aide.

    Le sscanf indiqué ne fonctionne que dans le premier cas. Dans le second, il ne fonctionne pas. Il semblerait que le fait qu'il n'y ait aucun caractère entre les "::" ne lui convienne pas.

    De cela j'en ai déduit (peut-être à tort) que l'expression de mon sscanf devait manquer d'un élément quantitatif (zéro ou plusieurs éléments). Ne sachant pas comment écrire cela j'ai finalement opté pour vous demander de l'aide.

    Je vois qu'il existe une fonction strtok() pour séparer les éléments d'une chaine. Je ne la connaissais pas. Elle me permettra d'obtenir le résultat escompté.

    Encore merci à tous.
    Je découvre avec plaisir de nouvelles fonctions et d'autres façons de réaliser certaines actions grâce à vous tous. Je devrais venir ici plus souvent !

    Bonne journée à tous.
    LN.

  9. #9
    Expert éminent sénior
    Il semblerait que le fait qu'il n'y ait aucun caractère entre les "::" ne lui convienne pas.
    Effectivement, j'avais zappé le fait que la norme ne spécifie de comportement que pour une chaine à analyser non vide. Donc dans ce cas tout dépend du compilateur utilisé.

    Tu devrais pouvoir t'en tirer de cette façon :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
      if(sscanf(ligne_a_analyser,"%50[^:]:%*[^:]:%50[^:]",groupe,gid)!= 2)
          sscanf(ligne_a_analyser,"%50[^:]::%50[^:]",groupe,gid);

    ou si tu veux vérifier si le format des chaines est correct :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
      if((i=sscanf(ligne_a_analyser,"%50[^:]:%*[^:]:%50[^:]",groupe,gid))!= 2)
          i = sscanf(ligne_a_analyser,"%50[^:]::%50[^:]",groupe,gid);
    //  if(i==2) printf("<%s> <%s>\n", groupe, gid);
    //  else printf("Erreur de format\n");
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  10. #10
    Membre éprouvé
    Ce message n'a pas pu être affiché car il comporte des erreurs.
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  11. #11
    Modérateur

    Citation Envoyé par ssmario2 Voir le message
    - Pour ce qui est de strtok(), son fonctionement fait que deux séparateurs (ou plus) qui se suivent sont considérés comme un seul, ce qui ne permet donc pas de détecter les champs vide.
    Pertinent !
    Du coup, c'est moi qui lui ai filé un nouveau tuyau percé !

###raw>template_hook.ano_emploi###