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 :

Extraire des chaines de caractères


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 11
    Par défaut Extraire des chaines de caractères
    Bonjour,

    Je viens vers vous car j'aimerai avoir un peu d'aide pour réaliser une extraction de plusieurs chaines de caractère présentent dans un fichier .txt

    Actuellement j'écris via un programme C, dans un fichier data.txt les informations suivantes :

    Network:Name = "Romain"
    Network:NodeType = "leader"
    IPv6:MeshLocalAddress = "fdf2:fd0f:3469:0:930c:8f11:c4e6:f811"

    J'aimerai viens un programme C faire une extraction des chaines de caractère "Romain", "Leader" et "fdf2:fd0f:3469:0:930c:8f11:c4e6:f811" sans les ".

    Sachant qu'elles sont entre ", je me dis que cela est possible (ces datas sont variable).

    Par ailleurs je ne souhaite pas extraire les trois à l'éxecution, seulement une parmis les trois suivant le choix de l'utilisateur.

    Exemple avec un programme extractData.c :

    ./extractData 1
    Renvoi Romain

    ./extractData 2
    Renvoi leader

    ./extractData 3
    Renvoi fdf2:fd0f:3469:0:930c:8f11:c4e6:f811

    Voilà je sais pas si je suis très clair, j'ai effectué quelques recherche et j'ai trouvé des choses similaire mais jamais en C.

    Merci d'avance !

    Romain

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    https://en.cppreference.com/w/c/string/byte/strchr

    Citation Envoyé par RomainVST Voir le message
    Par ailleurs je ne souhaite pas extraire les trois à l'éxecution, seulement une parmis les trois suivant le choix de l'utilisateur.
    Avec une signature de point d'entrée de la forme int main(int argc, char *argv[]), les paramètres passés à ton programme sont disponibles dans argv pour consultation. Tu trouveras probablement une entrée dans la FAQ C concernant cela. Le reste c'est de l'algorithmique.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par RomainVST Voir le message
    Actuellement j'écris via un programme C, dans un fichier data.txt les informations suivantes :
    Network:Name = "Romain"
    Network:NodeType = "leader"
    IPv6:MeshLocalAddress = "fdf2:fd0f:3469:0:930c:8f11:c4e6:f811"
    Oui, un peu comme les fichiers ".ini".

    Citation Envoyé par RomainVST Voir le message
    Sachant qu'elles sont entre ", je me dis que cela est possible (ces datas sont variable).
    Il vaut mieux te caler sur le "=" qui sépare le titre de sa valeur plutôt que sur les guillemets qui ne sont (enfin dans les vrais fichiers ".ini") pas toujours présents.

    Citation Envoyé par RomainVST Voir le message
    Par ailleurs je ne souhaite pas extraire les trois à l'éxecution, seulement une parmis les trois suivant le choix de l'utilisateur.
    Tu fais comme Matt_Houston t'indique en regardant ensuite le contenu de argv[1] Et fais attention car argv[x] est une chaine or une chaine contenant (par exemple) "1" ce n'est pas égal à 1.
    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]

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 11
    Par défaut
    Super merci des réponses, je pense pouvoir me débrouiller !

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 11
    Par défaut
    Voilà j'ai créer le code suivant qui répond à mes attentes ! Merci pour l'aide

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <regex.h>
     
    int main (int argc, char **argv)
    {
     
        if(argc != 2)
        {
            printf("USAGE: %s [0] = NetworkName ; [1] = NodeType ; [2] = IPv6 Addr \n", argv[0]);
            exit(-1);
        }
     
     
       int err;
       int i, iLigne = atoi(argv[1]);
       regex_t preg;
       char *str_request = NULL;
       const char *str_regex = "\"(.*)\"";
     
     
     
       FILE *fp = fopen ("data.txt", "r");
     
       if (fp != NULL)
       {
     
          for (int i=0; i<=iLigne; i++) {
     
          str_request = fgets (ligne, sizeof ligne, fp);   
     
          }      
     
          fclose (fp);
       }
       else
       {
          printf ("Erreur d'ouverture du fichier\n");
       }
     
     
     
       err = regcomp (&preg, str_regex, REG_EXTENDED);
       if (err == 0)
       {
          int match;
          size_t nmatch = 0;
          regmatch_t *pmatch = NULL;
     
          nmatch = preg.re_nsub;
          pmatch = malloc (sizeof (*pmatch) * nmatch);
          if (pmatch)
          {
     
             match = regexec (&preg, str_request, nmatch, pmatch, 0);
     
             regfree (&preg);
     
             if (match == 0)
             {
                char *site = NULL;
                int start = pmatch[0].rm_so + 1;
                int end = pmatch[0].rm_eo - 1;
                size_t size = end - start;
     
                site = malloc (sizeof (*site) * (size + 1));
                if (site)
                {
                   strncpy (site, &str_request[start], size);
                   site[size] = '\0';
                   printf ("%s\n", site);
                   free (site);
                }
             }
     
             else if (match == REG_NOMATCH)
             {
                printf ("%s n\'est pas une data valide\n", str_request);
             }
     
             else
             {
                char *text;
                size_t size;
     
     
                size = regerror (err, &preg, NULL, 0);
                text = malloc (sizeof (*text) * size);
                if (text)
                {
     
                   regerror (err, &preg, text, size);
                   fprintf (stderr, "%s\n", text);
                   free (text);
                }
                else
                {
                   fprintf (stderr, "Memoire insuffisante\n");
                   exit (EXIT_FAILURE);
                }
             }
          }
          else
          {
             fprintf (stderr, "Memoire insuffisante\n");
             exit (EXIT_FAILURE);
          }
       }
     
       return (0);
    }

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 151
    Billets dans le blog
    4
    Par défaut
    Tu devrais rajouter des exit sur tous les cas d'erreurs. Sinon tu vas avoir un crash ou comportements indetermines.
    En plus de rendre le tout plus homogene vu que t'en as deja quelques-uns
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Et peut-être aussi, en cas d'erreur à une étape X, libérer ce qui est alloué lors des X-1 étapes précédentes.

    A ce propos d'ailleurs, faire de l'allocation "précise" c'est bien, c'est robuste, mais parfois ce n'est pas nécessaire.
    Exemple, tu alloues "text" en fonction d'une regex (enfin il me semble). Mais si tu pars de l'hypothèse que ce texte ne fera jamais plus de 100 caractères, tu peux alors tenter un char text[100] et te passer du couple maudit malloc + free. Et si c'est pas 100 mais 1000 ben tu adaptes.
    C'est prendre un risque (tu ne peux pas être certain que "text" ne sera jamais dépassé) mais c'est un risque dont la criticité dépend de la probabilité que l'évènement arrive. Bref c'est un équilibre triangulaire entre "robustesse", "simplicité de développement" et "risque calculé".

    PS: dans ton code, la variable "ligne" n'a pas été définie.
    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]

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

Discussions similaires

  1. VBA excel extraire des chaines de caractéres d'une cellule
    Par AimeDija dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 01/08/2018, 13h23
  2. [DATA] Extraire des chaines de caractères
    Par étudiant11 dans le forum SAS Base
    Réponses: 4
    Dernier message: 02/03/2015, 12h03
  3. Extraire des chaines de caractère avec position dynamique
    Par SOPSOU dans le forum Développement
    Réponses: 5
    Dernier message: 09/04/2014, 18h23
  4. Extraire des 4 dernier caractères d'une chaine
    Par Niko_de_bordo dans le forum Débuter
    Réponses: 9
    Dernier message: 19/06/2009, 17h49
  5. Extraire des chaines de caractères dans un fichier
    Par cycy75 dans le forum Scripts/Batch
    Réponses: 16
    Dernier message: 27/03/2009, 14h56

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