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 :

Reconnaissance de plusieurs chaine dans une chaine


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 55
    Points : 25
    Points
    25
    Par défaut Reconnaissance de plusieurs chaine dans une chaine
    Je voudrais reconnaitre plusieurs chaine dans une chaine. J'ai essayer :



    sscanf(Chaine,"%s@%s.%s",Nom,Domaine,Extension)

    Ma chaine contient par exemple toto@wanadoo.fr et je voudrais récupérer les champs !!
    Je sais que je pourrais le faire en utilisant strtok mais je pense qu'il y a moyen de le faire avec le sscanf !!

    avec un truc dans le genre %[^@]s car avec ca, je récupere deja le nom

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    Salut
    Bon c peu etre idiot et je connait pas trop mais pourkoi tu ne recupere pas ta chaine en un seul morceau puis tu la decoupe...

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 55
    Points : 25
    Points
    25
    Par défaut
    Ben je la récupere en un seul morceau !!
    Ce que j'essaye de faire la, c'est de la découpé sans utiliser strtok ou une recherche de mes caracteres @ et . dans ma chaine !!

  4. #4
    Membre averti

    Inscrit en
    Juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sscanf("brunomailly@yahoo.fr","%[^@]@%[^.].%s",Nom,Domaine,Extension);
    sscanf("brunomailly@yahoo.fr","%63[^@]@%63[^.].%63s",Nom,Domaine,Extension); //version limitant l'écriture à 64 caractères
    Les [] remplacent le s dans le format, ça ne vient pas en plus.

    Pas bête d'utiliser scanf.
    "J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone."-Bjarne Stroustrup
    www.stroustrup.com

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 55
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par Musaran
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sscanf("brunomailly@yahoo.fr","%[^@]@%[^.].%s",Nom,Domaine,Extension);
    sscanf("brunomailly@yahoo.fr","%63[^@]@%63[^.].%63s",Nom,Domaine,Extension); //version limitant l'écriture à 64 caractères
    Les [] remplacent le s dans le format, ça ne vient pas en plus.

    Pas bête d'utiliser scanf.

    Merci ca marche nickel mais pourquoi tu met 63 ?!!

  6. #6
    Nouveau membre du Club
    Inscrit en
    Août 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 55
    Points : 25
    Points
    25
    Par défaut
    Au fait, je voulais savoir si on pouvait aussi mettre dans ce scanf les caracteres authorisés ?!

    Pour bien sur, ne pas récupérer mes 3 champs si dans le nom, domaine ou extension des caracteres non authorisés !! Mais été donné que les caracteres non authorisé sont plus nombreux que ceux authorisés, il est plus facile des mettre ceux authorisé.

    Surtout que j'ai lu qu'on pouvais mettre[a-z] pour dire que ce sont des chaines minuscules !! Mais je n'ai pas réussis a tout combiné, les caracteres authorisé et les séparateurs.

  7. #7
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Il met 63 pour limiter a 63 caracteres (Si tu definis tes chaines commes des char Nom[64]).

    Sinon, pour specifier les char autoriser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      nbre=sscanf("brunomailly1@yahoo.fr","%63[a-z_0-9]@%63[a-z_0-9].%63[a-z_0-9]",Nom,Domaine,Extension); 
    if (nbre!=3) 
     // erreur tous les champs noms reconnus !

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par taupin
    Merci ca marche nickel mais pourquoi tu met 63 ?!!
    Il a mis 63 pour limiter la saisie. L'interet est pour ne pas avoir de buffer overflow. Si tu definis tes chaines de caracteres avec un taille de 64 il vaut mieux ne pas lire plus de 63 caracteres.

  9. #9
    Membre averti

    Inscrit en
    Juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    Merci ca marche nickel mais pourquoi tu met 63 ?!!
    On t'a déjà répondu pour ça...
    Mais attention, si la limite est atteinte, sscanf ne s'arrête pas sur le limiteur attendu, et toute la suite de la saisie échoue.

    Surtout que j'ai lu qu'on pouvais mettre [a-z]... pour dire que ce sont des chaines minuscules !! Mais je n'ai pas réussis a tout combiné, les caracteres authorisé et les séparateurs.
    Le format [a-z] est communément supporté, mais il ne fait pas partie du standard.

    A ma connaissance, il n'y a pas moyen de combiner les caractères acceptés et exclus dans un même format. D'ailleurs, que serait censé faire sscanf ?
    Une solution simple est de faire un second passage pour analyser les champs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sscanf(Nom,"%63[a-zA-Z0-9_]",NomFiltre);
    sscanf(Nom,"%1[a-zA-Z_]%63[a-zA-Z_0-9]", NomFiltre, NomFiltre+1); //pas de chiffre de tête
    Si NomFiltre est plus court que Nom, ou inchangé, le nom est incorrect.
    "J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone."-Bjarne Stroustrup
    www.stroustrup.com

  10. #10
    Nouveau membre du Club
    Inscrit en
    Août 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 55
    Points : 25
    Points
    25
    Par défaut
    Pour combiner les deux c'est vrai que je n'y suis pas arrivé !!
    Par contre, je voudrais savoir comment fonctionne le sscanf car s'il parcours la chaine, je pense qu'il est plus rapide de parcourir directement la chaine, de comparer les caracteres et d'attendre le @ puis le . !!

    En revanche si le sscanf fonctionne autrement, il est peu etre plus avantageux de faire avec le sscanf !!

    Pour combiner les 2, j'ai fais plutot 2 sscanf, un avec les caracteres délimiteurs comme @ et . ; et un autre avec les caracteres authorisés !! Si les 3 chaines obtenus avec le 1er sont identiques a celles obtenues avec le 2eme c'est que la saisie a été bonne. Mais bon, si le sscanf parcours la chaine, on la parcourra 2 fois !!

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    J'ai le même problème mais légèrement différent :
    j'ai un fichier du style : nom téléphone
    moi j'utilise la fonction fscanf et donc j'aimerai extraire un nom dans mon fichier qui serait composer ex :
    de la coudraie 0301020102
    donc je voudrai extraire "de la coudraie" et "0301020102" séparement.
    j'ai utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fscanf(fd, "[^\t] \t %s", name, phone);
    et bien entendu, dans l'écriture du fichier j'ai inséré les tabulations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fprintf(fd, "%s\t %s\n", e->nom, e->tel);
    ça ne fonctionne pas même si à la place des tabulations je mets des ":".
    merci d'avance pour votre aide.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Août 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 55
    Points : 25
    Points
    25
    Par défaut
    Ton probleme vient du fait que sscanf s'arrete au 1er espace !!

    Essaie un nom sans espace, ca devrait fonctionner !!

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Je le sais bien mais je dois pouvoir gérer des noms composés avec espace, d'où ma question.
    Merci pour votre aide.

  14. #14
    Nouveau membre du Club
    Inscrit en
    Août 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 55
    Points : 25
    Points
    25
    Par défaut
    Tu as essayer fscanf(fd, "[^\t]\t%[0-9]", name, phone); ??

  15. #15
    Nouveau membre du Club
    Inscrit en
    Août 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 55
    Points : 25
    Points
    25
    Par défaut
    Au fait, il faut passer tes arguments avec par leur adresses !!

    &nom et &tel

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Je te remercie pour ta réponse mais pour les arguments, c'est des tableaux donc je ne dois pas mettre le &.
    Merci, je vais essayer ton code.

  17. #17
    Nouveau membre du Club
    Inscrit en
    Août 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 55
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par tougirl
    Je te remercie pour ta réponse mais pour les pointeurs, c'est des tableaux donc je ne dois pas mettre le &.
    Merci, je vais essayer ton code.
    Bon, moi j'ai tester avec des chaines et pas des pointeurs !!
    J'ai mis ca : sscanf(fd, "%[^\t]\t%[0-9]", name, phone) et ca marche mais bon, je le fais a partir d'une saisie !!

    Sinon j'ai pas tester a partir d'un fichier !! Mais ca devrait marcher !!


    J'aurais voulu te poser une question !! Tu lis dans ton fichier et tu utilise des pointeurs !! Mais comment tu fais pour allouer la place nécessaire alors que tu ne connais pas la taille de tes champs ?

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    non, je me suis planter je voulais dire mes arguments sont une structure avec des champs de tableau donc ça fonctionne très bien, c'est d'ailleurs pour ça que je mets e->nom pour écrire dans mon fichier e est un pointeur sur une structure.
    pour ce qui de ton code, il ne marche pas, c'est assez bizarre car quand j'utilise le programme sans tabulations et avec des noms sans espaces tous marche bien, mais dès que je mets les tabulations et bien mon programme ne lit plus les lignes suivantes sur le fichier, faut que je buche là-dessus.
    merci

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    En fait il marche ton code mais ya un problème avec la dernière ligne du fichier, il ne la lit plus.
    Dans ton code j'ai dût rajouter un \n à la fin, logique puisque je l'insère dans le fprintf.
    Merci encore pour ton code et je vais voir ce qui cloche, ça ne doit pas être bien terrible.

  20. #20
    Nouveau membre du Club
    Inscrit en
    Août 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 55
    Points : 25
    Points
    25
    Par défaut
    Je pourrais voir ta structure ?
    Ce que tu as dans ta structure, ce sont des pointeurs de chaine ou des chaines de taille définie ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. recherche d'une chaine dans une chaine
    Par Katachana dans le forum Langage
    Réponses: 2
    Dernier message: 15/07/2008, 12h10
  2. recherche d'une chaine dans une chaine
    Par jpclutier dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 03/12/2007, 11h30
  3. Tester une chaine dans une chaine
    Par ulysse031 dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 26/03/2007, 00h48
  4. chercher caractére d'une chaine dans une chaine
    Par ulysse031 dans le forum Langage
    Réponses: 25
    Dernier message: 21/03/2007, 18h09
  5. Réponses: 2
    Dernier message: 19/10/2005, 15h38

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