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 :

Comment "éclater" une chaine de char ?


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 67
    Points : 31
    Points
    31
    Par défaut Comment "éclater" une chaine de char ?
    Hello,

    voilà mon objectif : Je voudrais monitorer automatiquement l'état (connecté ou non) des postes connecté sur la même plage d'adresse ip d'un client. Exemple :
    J'ai 192.168.1.2, à l'execution de mon programme, j'aimerais d'une récupérer l'ip locale, prendre cette ip et la découper en 4, mettre de côté les 3 premières parties (donc 192, 168 et 1) puis de faire un ping sur toute la plage ip, en partant de 192.168.1.0 à 192.168.1.254.

    J'aurais donc besoin de savoir "découper mon ip en 4", et de la reconsituter en incrémentant à chaque fois le numero du poste (donc 192.168.1.X où X est ce numero) pour procéder à mon test.

    J'ai bien pensé à strpbrk ou strstr, mais non, pas de solution avec ces deux fonctions.

    Auriez vous une idée sur la façon de procéder au découpage de mon ip ?

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Comme tu as une chaine formattee, sscanf() est ton amie.

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Avec sscanf
    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int n1,n2,n3,n4;
    sscanf(taChaine,"%d%*[.]%d%*[.]%d%*[.]%d",&n1,&n2,&n3,&n4);
    EDIT : Et grillé...

  4. #4
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 67
    Points : 31
    Points
    31
    Par défaut
    En fait, j'ai une fonction qui me récupère l'ip du poste. Donc je pars de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char ip[13] = "192.168.1.2" ;
    Et j'aimerais arriver à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int long n1 = "192" ;
    int long n2 = "168" ;
    int long n3 = "1" ;
    int long n4 = "2" ;

  5. #5
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Pourquoi vouloir travailler sur des chaines de caracteres? Travailler avec des entiers est trivial, notamment pour incrementer la derniere valeur. Si tu as besoin d'une IP en chaine de caractere, sprintf() est la pour ca.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 67
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par DaZumba Voir le message
    Pourquoi vouloir travailler sur des chaines de caracteres? Travailler avec des entiers est trivial, notamment pour incrementer la derniere valeur. Si tu as besoin d'une IP en chaine de caractere, sprintf() est la pour ca.
    Exact pour les int, je vois pas pourquoi je voulais bosser en long int..

    Concernant sprintf(), je m'en sers pour justement réassembler les ip (en incrémentant le dernier int), mais je ne savais pas qu'on pouvait "désassembler" une chaine avec.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Points : 29
    Points
    29
    Par défaut
    Ca ou alors partir de ta chaine et utiliser le sscanf que Tomy a présenté un peu plus haut

    Sauf que tu ne récupères que la dernière valeur, en t'assurant néanmoins que les autres sont correctes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(ip, "%*[0-255]%*[.]%*[0-255]%*[.]%*[0-255]%*[.]%d", &n4);
    NB : je ne suis VRAIMENT pas certain de mon format... Je l'ai fait "à vue de nez". C'est juste pour illustrer le principe...

  8. #8
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par nuitn0ire Voir le message
    Concernant sprintf(), .... mais je ne savais pas qu'on pouvait "désassembler" une chaine avec.
    Ce n'est pas ce qu'a voulu dire DaZumba qui a effectivement proposé sscanf pour "désassembler" la chaîne et sprintf pour "réassembler"
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    d'autre part, avec 13, tu vas te planter.. C'est 16 :

    4*3 + 3 + 1
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 107
    Points : 82
    Points
    82
    Par défaut
    vous pouvez faire un fonction qui cherche les "." dans une chaine et retourne un char** avec pour chaque entité une sous chaine.

  11. #11
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Tu compte le nombre d'occurrences du délimiteur dans la chaine. Tu malloc ton tableau de la bonne taille. Tu boucle en faisant des strtok.

    Ya peut-être mieux. Je connais pas de fonctions qui le font.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 67
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par groscask Voir le message
    Ca ou alors partir de ta chaine et utiliser le sscanf que Tomy a présenté un peu plus haut

    Sauf que tu ne récupères que la dernière valeur, en t'assurant néanmoins que les autres sont correctes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(ip, "%*[0-255]%*[.]%*[0-255]%*[.]%*[0-255]%*[.]%d", &n4);
    NB : je ne suis VRAIMENT pas certain de mon format... Je l'ai fait "à vue de nez". C'est juste pour illustrer le principe...
    Nope, ne marche pas chez moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char ip[16] = "192.168.1.2";
    int n4 = "0";
    sscanf(ip, "%*[0-255]%*[.]%*[0-255]%*[.]%*[0-255]%*[.]%d", &n4);
    printf("%d",n4);

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/05/2008, 18h43
  2. Conversion d'une chaine de char en numerique
    Par simone.51 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 25/03/2004, 16h47
  3. Réponses: 2
    Dernier message: 06/12/2002, 07h50

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