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 :

Récupération de valeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut Récupération de valeur
    Bonjour,

    je dois récupérer des IP provenant d'un traceroute comme dans l'exemple suivant et les stockées dans un tableau de char **
    De plus, il ne faut pas tenir compte des * ainsi que de certaines plages IP qui sont les suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    10.0.0.0 à 10.255.255.255
    172.16.0.0 à 172.31.255.255
    192.168.0.0 à 192.168.255.255
    224.0.0.0 à 239.255.255.255
    240.0.0.0 à 255.255.255.255
    J'aimerais avoir une aide car je ne sais pas comment m'y prendre

    Merci d'avance


    Exemple de fichier ou il faut récupérer les IP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     1  192.168.0.1  9.754 ms  9.461 ms  8.046 ms
     2  195.6.244.14  60.885 ms  48.924 ms  90.517 ms
     3  194.206.126.244  50.503 ms  48.97 ms  120.122 ms
     4  194.206.126.2  55.655 ms  52.213 ms  58.908 ms
     5  * * *
     6  208.213.229.130  588.303 ms  589.843 ms  589.611 ms
     7  208.213.229.129  599.564 ms  599.763 ms  600.749 ms
     8  208.213.229.226  629.167 ms  599.284 ms  599.383 ms
     9  157.130.34.217  642.326 ms  715.072 ms  653.724 ms
    10  146.188.160.62  595.143 ms  590.433 ms  659.247 ms
    11  146.188.160.181  649.863 ms  700.901 ms  617.067 ms
    12  137.39.253.86  600.835 ms  599.379 ms  590.867 ms
    13  192.48.96.9  607.071 ms  589.221 ms  603.156 ms

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    J'ai comme une impression de déja vu

    Bon j'improvise un algo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    popen() sur la commande traceroute;
     
    pour chaque ligne lue dans le pipe (utiliser fgets()) faire
      avoir un pointeur sur le caractere courant et le faire pointer sur le premier car de la ligne;
      avancer jusqu'a detecter un chiffre;
      avancer jusqu'a detecter kekchose qui n'est pas un chiffre;
      avancer jusqu'a detecter un chiffre et sauvegarder cette position;
      avancer jusqu'a detecter kekchose qui n'est pas un chiffre ni un point et sauvegarder cette position;
      extraire d'une maniere ou d'une autre la sous chaine comprise entre les 2 positions sauvegardées;
      si elle ne fait pas partie des ip ignorées alors
        inserer dans la liste cette ip;
      fin si;
    fin pour;
    Pour la liste tu peux utiliser une liste chainée, ou un tableau de taille fixe en prevoyant large (cette solution est moins compliquée donc plus fiable).
    Pour extraire la sous-chaine tu peux utiliser strncpy(). Sinon tu peux aussi terminer la chaine apres le dernier caractere de l'ip dans le buffer de lecture du resultat du popen.
    Note : pour toutes les etapes "avance jusqu'a" il faudra faire attention à ne pas depasser la chaine lue.

  3. #3
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Salut,

    Tu peu, peu être, utiliser la fonction sscanf en contrôlant le nombre de champs lu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /* Les variables ligne, ip et temp sont des chaînes correctement dimensionnées */
     
    ret = sscanf(ligne, "%s  %s  %s ms  %s ms  %s ms\n", &temp, &ip, &temp, &temp, &temp) ;
    if(ret==5) printf("%s\n", ip) ;
    Il faut faire attention, car cela marche si tes lignes ont constament le même format (qu'elle contiennent toujours le même nombre de champs maximum; ici 5 champs).

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut
    Les types des variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char *tmp;
       char **tab;
       int nb = 1, size = 1;
       char **pt;
    Je mets le code qui permet le traitement des lignes.
    Ce que j'essayes de faire par exemple si une ligne que j'analyse est la suivante:
    1 192.168.0.1 9.754 ms 9.461 ms 8.046 ms
    p pointe sur le 1 er blanc, ensuite tmp pointe sur le début de la chaine "192...."
    p pointe ensuite sur le second blanc et je mets un '\0' pour avoir la fin de la chaine tmp.

    Je devrais donc avoir pour tmp la chaine tmp = "192.168.0.1", or ce n'est pas ce qui se passe.

    J'aimerais bien savoir ce qui ne va pas

    Merci

    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
     while (fgets(line, sizeof line, fp) != NULL)
         {
           char *p = strtok(line, " ");
           if (p != NULL)
             {
               tmp = p + 1;
               p = strtok(NULL, " ");
               if (p != NULL)
             {
               *p = '\0';
     
               if(nb == size)
                 {
                   size *= 2;
     
                  tab = realloc(tab, size * sizeof *tab);
                  if (tab == NULL)
                {
                  perror("erreur allocation\n");
                  exit(1);
                }
                 }
               tab[nb-1] = malloc((strlen(tmp)+1) * sizeof * tab[nb-1]);
               if (tab[nb-1] == NULL)
                 {
                   perror("erreur allocation\n");
                   exit(1);
                 }
               strcpy(tab[nb-1],tmp);
     
             }
               else
             {
               printf ("format error\n");
               break;
             }
             }
           else
             {
               printf ("format error\n");
               break;
             }
         }

  5. #5
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    D'apres ton exemple de traceroute plus haut, les separateurs ne sont pas un espace unique mais une ensemble de caracteres blancs (c'est ptet des tab, c'est ptet plusieurs espaces)
    Donc ton strtok(line, " ") ne marchera pas comme tu l'escomptes

  6. #6
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut
    J'ai rajouté ce qui est en gras pour que la chaine p pointe sur le premier caractère qui n'est pas un espace. tmp pointe ensuite sur le début de la chaine qu'on veut récupérer.
    Le problème est que je ne sais pas très bien d'ou peut venir le problème

    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
     while (fgets(line, sizeof line, fp) != NULL)
         {
           char *p = strtok(line, " ");
           if (p != NULL)
             {
               p++;
               
               while(*p == " ")
             p++;
               
               tmp = p;
               
               p = strtok(NULL, " ");
               if (p != NULL)
             {
               *p = '\0';
               
               if(nb == size)
                 {
                   size *= 2;
                   
                   tab = realloc(tab, size * sizeof *tab);
                   if (tab == NULL)
                 {
                   perror("erreur allocation\n");
                   exit(1);
                 }
                 }
               tab[nb-1] = malloc((strlen(tmp)+1) * sizeof * tab[nb-1]);
               if (tab[nb-1] == NULL)
                 {
                   perror("erreur allocation\n");
                   exit(1);
                 }
               strcpy(tab[nb-1],tmp);
               
             }
               else
             {
               printf ("format error\n");
               break;
             }
             }
           else
             {
               printf ("format error\n");
               break;
             }
         }

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
           char *p = strtok(line, " ");
           if (p != NULL)
             {
               tmp = p + 1;
               p = strtok(NULL, " ");
               if (p != NULL)
             {
               *p = '\0';
    Le premier strtok va mettre p sur le premier '1' de "1 192.168.0.1 ....." et met un '\0' dans line derriere ce '1'.
    line devient 1'\0'192.168.0.1 .....
    tmp pointe ensuite sur ce '\0' !
    Le deuxième strtok va mettre p sur le (premier)1 de 192.168.0.1 et met un '\0' dans line derriere le dernier '1' . Aussi sec ce premier '1' est remplacé par '\0' !
    Dans line, à partir de p, on a maintenant '\0'92.168.0.1'\0'. temp ne pointe pas sur le début du 192....qui est d'ailleurs détruit
    Pourquoi pas tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
           char *p = strtok(line," ");
           if (p != NULL)
             {
               p = strtok(NULL, " ");
               if (p != NULL)
               {
                ........
              tab[nb-1] = malloc((strlen(p)+1) * sizeof * tab[nb-1]);
                ........
    ----------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
               while(*p == " ")
             p++;
    strtok sautera tout seul tous les blancs

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

Discussions similaires

  1. Une erreur 233 de ms sql server
    Par Hokage dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 05/10/2009, 17h40
  2. Erreur 233 sous sql server
    Par brajae85 dans le forum Oracle
    Réponses: 3
    Dernier message: 18/05/2009, 16h12
  3. Réponses: 2
    Dernier message: 05/10/2004, 22h43

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