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 :

extraction d'une chaîne de caractère


Sujet :

C

  1. #1
    Membre régulier Avatar de mackla
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 140
    Points : 120
    Points
    120
    Par défaut extraction d'une chaîne de caractère
    bonjour,

    j'ai chercher parmis les fonctions de manipulation des chaînes de caractères, mais aucune ne ma aider à résoudre mon problème.le voici:
    je veut extraire une chaîne de caractère (je ne la connais pas au préalable) mais je sais quel est comprise entre daux mots chaine_1 et chaine_2.

    comment je pourais extraire cette chaîne en utilisant ces deux mots comme clé?

    merci pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mackla Voir le message
    bonjour,

    j'ai chercher parmis les fonctions de manipulation des chaînes de caractères, mais aucune ne ma aider à résoudre mon problème.le voici:
    je veut extraire une chaîne de caractère (je ne la connais pas au préalable) mais je sais quel est comprise entre daux mots chaine_1 et chaine_2.

    comment je pourais extraire cette chaîne en utilisant ces deux mots comme clé?

    merci pour votre aide.
    Tu prends les intervenants pour des sorciers ?
    D'où veux-tu extraire ta chaine ? D'un fichier ? D'une chaine plus grande ???
    Quel langage de programmation ? Shell ? C ? Autre ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre régulier Avatar de mackla
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 140
    Points : 120
    Points
    120
    Par défaut
    D'où veux-tu extraire ta chaine ?
    d'un buffer qui contient des chaînes, et celle que je veut est délimiter par les deux mots que j'ai cités (chaine_1 chaine_2).

    Quel langage de programmation ? Shell ? C ? Autre ???
    C sous linux.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mackla Voir le message
    d'un buffer qui contient des chaînes, et celle que je veut est délimiter par les deux mots que j'ai cités (chaine_1 chaine_2).
    ok
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *deb=strstr(buffer, "chaine_1") + strlen("chaine_1");
    char *fin=strstr(buffer, "chaine_2")
    Tout ce qui se trouve entre les pointeurs "deb" et "fin" est la chaine que tu cherches

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *dest;
    dest=malloc(fin - deb + 1)
    strncpy(dest, deb, fin - deb);
    dest[fin - deb]='\0';
    printf("%s\n", dest);
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre régulier Avatar de mackla
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 140
    Points : 120
    Points
    120
    Par défaut Erreur de segmentation
    j'ai une erreur de segmentation dans mon code, et je ne sais pas d'ou ca peut venir
    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
    char *dest = NULL;
     
    char *deb = strstr(buffer, "chaine_1") + strlen("chaine_1");
    char * fin = strstr(buff, "chaine_2");
     
    dest =malloc(fin-deb+1);
    if (dest != NULL)
      {
        if (strncpy(dest, deb, (fin-deb)) == 0)
         {
           printf("erreur\n");
           return 0;
         }
        printf("%s\n", dest);
        free(dest);
      }
    printf("erreur de malloc\n");

  6. #6
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par mackla Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *deb = strstr(buffer, "chaine_1") + strlen("chaine_1");
    char * fin = strstr(buff, "chaine_2");
    buffer != buff ??????
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  7. #7
    Membre régulier Avatar de mackla
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 140
    Points : 120
    Points
    120
    Par défaut
    buffer != buff ??????
    c'est une erreur de frappe que j'ai comis sur le poste. mon vrai code est écrit avec buffer"
    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
    char *dest = NULL;
     
    char *deb = strstr(buffer, "chaine_1") + strlen("chaine_1");
    char * fin = strstr(buffer, "chaine_2");
     
    dest =malloc(fin-deb+1);
    if (dest != NULL)
      {
        if (strncpy(dest, deb, (fin-deb)) == 0)
         {
           printf("erreur\n");
           return 0;
         }
        printf("%s\n", dest);
        free(dest);
      }
    printf("erreur de malloc\n");

  8. #8
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Sans avoir tout le code, rien ne nous dit que l'erreur de segmentation ce trouve dans cette portion de code.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par mackla Voir le message
    bonjour,

    j'ai chercher parmis les fonctions de manipulation des chaînes de caractères, mais aucune ne ma aider à résoudre mon problème.le voici:
    je veut extraire une chaîne de caractère (je ne la connais pas au préalable) mais je sais quel est comprise entre daux mots chaine_1 et chaine_2.

    comment je pourais extraire cette chaîne en utilisant ces deux mots comme clé?

    merci pour votre aide.

  10. #10
    Membre régulier Avatar de mackla
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 140
    Points : 120
    Points
    120
    Par défaut
    Sans avoir tout le code, rien ne nous dit que l'erreur de segmentation ce trouve dans cette portion de code.
    avant d'ajouter cette partie de code mon programme fonctionner très bien.

  11. #11
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Ce code a l'air de fonctionner correctement :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    int main (void)
    {
       int err = 0;
       char const *buffer = "ertydchaine_1fonctionne_correctementchaine_2";
       char const *deb    = strstr(buffer, "chaine_1") + strlen("chaine_1");
       char const *fin    = strstr(buffer, "chaine_2");
     
       char *dest = malloc (fin - deb + 1);
       if (dest == NULL || 
           strncpy (dest, deb, fin - deb) == NULL)
       {    
          perror("erreur");
          err = EXIT_FAILURE;
       }  
       else
       {
          dest[strlen (dest)] = 0;
          puts (dest);
       }
     
       if (dest != NULL)
             free (dest), dest = NULL;
     
       return err;
    }
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  12. #12
    Membre régulier Avatar de mackla
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 140
    Points : 120
    Points
    120
    Par défaut
    j'ai trouvé la faille. un pointeur que je n'avais pas mis à sa place dans mon programme d'avant (à part ce dernier code)

    merci pour votre aide

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mackla Voir le message
    c'est une erreur de frappe que j'ai comis sur le poste. mon vrai code est écrit avec buffer"
    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
    char *dest = NULL;
     
    char *deb = strstr(buffer, "chaine_1") + strlen("chaine_1");
    char * fin = strstr(buffer, "chaine_2");
     
    dest =malloc(fin-deb+1);
    if (dest != NULL)
      {
        if (strncpy(dest, deb, (fin-deb)) == 0)
         {
           printf("erreur\n");
           return 0;
         }
        printf("%s\n", dest);
        free(dest);
      }
    printf("erreur de malloc\n");
    Si j'ai pris la peine de mettre un '\0' ce n'est pas pour rien. strncpy() ne le fait pas systématiquement (et dans ton cas, il ne le fera absolument pas)

    Citation Envoyé par mackla Voir le message
    j'ai trouvé la faille. un pointeur que je n'avais pas mis à sa place dans mon programme d'avant (à part ce dernier code)
    Je crains le pire...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #14
    Membre régulier Avatar de mackla
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 140
    Points : 120
    Points
    120
    Par défaut
    Si j'ai pris la peine de mettre un '\0' ce n'est pas pour rien. strncpy() ne le fait pas systématiquement (et dans ton cas, il ne le fera absolument pas)
    pour le moment mon programme marche à merveille, vue que j'ai esséyer des cas particuliers

    pouvez vous me dire quel sont les failles de strncpy().

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    C'est bien simple: Si la chaîne à copier est plus grande que le buffer, le buffer ne sera pas terminé par un caractère nul.

    Il est préférable d'utiliser strncat() ainsi:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #define TAILLE 10
     
    ...
     
    char buf[TAILLE];
     
    /* Au lieu de : */
    strncpy(buf, "abcdefghijklmnopqrstuvwxyz", TAILLE);
     
    /* Utiliser: */
    buf[0] = '\0';
    strncat(buf, "abcdefghijklmnopqrstuvwxyz", TAILLE-1);
    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.

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

Discussions similaires

  1. Java - Extraction d'une chaîne de caractères
    Par ref92 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 23/06/2011, 00h37
  2. Jointure impliquant l'extraction d'une chaîne de caractères
    Par rplog dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 21/06/2011, 15h41
  3. [BO 5.1] Extraction dans une chaîne de caractères
    Par ruton dans le forum Débuter
    Réponses: 2
    Dernier message: 22/03/2008, 15h06
  4. Extraction d'une chaîne de caractère
    Par Hathor dans le forum VBScript
    Réponses: 1
    Dernier message: 25/04/2007, 07h36
  5. Extraction d'une chaîne de caractère avec SQL
    Par opeo dans le forum MS SQL Server
    Réponses: 13
    Dernier message: 28/07/2006, 15h36

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