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 :

Décomposer une string


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut Décomposer une string
    Bonjour,
    je recherche actuellement un moyen de décomposer un string, pour pouvoir par exemple stocker ensuite des valeurs contenues sans cette string dans différentes variables. Par exmple : j'ai un un variable char ip[] qui vaut "127.0.0.1". Comment faire pour au final stocker les valeurs 127, 0, 0 et 1 dans 4 autres variables numériques ? On peut rechercher le charactère '.' mais comment faire pour la suite ?
    Je travail aussi sur l'exploitation d'une base de données dont les valeurs associées (des plages d'IP et des noms de paus) sont séparées par des virgules. Le programme lis toutes les lignes une par une et décompose chaqune d'elle pour stocker les deux premières valeurs dans des variables de type int et les deux suivantes dans des variables de type char.
    Pouvez-vous m'aider ?
    Merci.

  2. #2
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Pour commencer, en C++, évites d'utiliser un tableau de caractères (char ip[]), et essaies plutôt de travailler avec une string.

    Et regardes dans la FAQ...
    http://c.developpez.com/faq/cpp/?pag...#STRING_tokens

  3. #3
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 59
    Points
    59
    Par défaut
    sinon, tu as la fonction Split() qui permet de découper un String suivant un caractère.

    je l'ai utilisé pour découposer une chaine afin de savoir si c'était une IP.

    Voila le petit exemple:
    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
     
    bool isIp(String* ip)
    {
    	/* 
    	2 lignes permettent de séparer le texte suivant un séparateur précis (.).
    	Le tout est stocké dans un tableau afin d'être traité pour la suite de la vérification.
    	*/
    	Char separator[] = {'.'};
    	String* split[] = ip->Split(separator);
    	// récupère la taille du tableau
    	int longueur = split->Length;
    	//Si le tableau comporte 4 élément je commence les tests sur chaque élément du tableau.
    	if (longueur == 4)
    	{
    		// Déclaration de quatre entiers me permettant de stocker la valeur de chaque String converties
    		int champUn, champDeux, champTrois, champQuatre;
    		// Bloc "try" me permettant de transformer chaque entrées du tableau en entier.
    		try
    		{
    			champUn = Convert::ToInt16(split[0]);
    			champDeux = Convert::ToInt16(split[1]);
    			champTrois = Convert::ToInt16(split[2]);
    			champQuatre = Convert::ToInt16(split[3]);
    		}
    		// Si une entrée du tableau n'est pas transformée en int, je retourne flase (pas d'IP)
    		catch (...)
    		{
    			return false;
    		}
    		// Test permettant de savoir si les nombres sont compris entre une valeur Min et Max (0 et 255 pour un champ d'une IP).
    		if (champUn < 1 || champUn > 255 ||
    			champDeux < 0 || champDeux > 255 ||
    			champTrois < 0 || champTrois > 255 ||
    			champQuatre < 0 || champQuatre > 255)
    		{
    			return false;
    		}
    		// Si tous les tests sont passés je retourne vrai.
    		else
    		{
    			return true;
    		}
    	}
    	// le tableau ne comporte pas 4 éléments, je n'ai donc pas une adresse IP;
    	else 
    	{
    		return false;
    	}
    }

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est sans doute spécifique à une plateforme, ce que tu donnes, non ?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    Merci beaucoup !

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 59
    Points
    59
    Par défaut
    possible que ce soit spécifique a une plate form.

    en ce qui me concerne, je programme sous Windows avec Visual studio .net.

    En tout cas, ce code est fonctionnel sous windows.

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est complètement spécifique à la plateforme Windows, et encore juste un compilateur.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    ha oui ca marche pas sur le mien (gcc)

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    T'as une fonction split dans boost.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par The Lord of Nesquik
    Bonjour,
    je recherche actuellement un moyen de décomposer un string, pour pouvoir par exemple stocker ensuite des valeurs contenues sans cette string dans différentes variables. Par exmple : j'ai un un variable char ip[] qui vaut "127.0.0.1". Comment faire pour au final stocker les valeurs 127, 0, 0 et 1 dans 4 autres variables numériques ? On peut rechercher le charactère '.' mais comment faire pour la suite ?
    Je travail aussi sur l'exploitation d'une base de données dont les valeurs associées (des plages d'IP et des noms de paus) sont séparées par des virgules. Le programme lis toutes les lignes une par une et décompose chaqune d'elle pour stocker les deux premières valeurs dans des variables de type int et les deux suivantes dans des variables de type char.
    Pouvez-vous m'aider ?
    Merci.

    regarde la fonction strtok

    ensuite tu peux convertir chacun des nombres avec atoi()
    100% et moins lourd que l'exemple ci dessus.

    Libre à toi d'utiliser la version qui te convient

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 38
    Points : 44
    Points
    44
    Par défaut Boost
    Une solution élégante pas pas simple est d'utiliser Boost.Regex et Boost.LexicalCast

    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
    #include <iostream>
    #include <string>
    #include <stdexcept>
    #include <boost/regex.hpp>
    #include <boost/lexical_cast.hpp>
     
    main()
    {
    .....
      try
      {
        boost::regex reg("(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3}).(\\d{1,3})");
        boost::smatch m;
        string chaine;
     
        if (boost::regex_match(chaine, m,reg))
        {
          cout << "Nb éléments : " << m.size() << endl;
          for (int i=1; i < 5; i++)
          {
            int  valeur = boost::lexical_cast<int>(m[i]);
            cout << "m[" << i << "]" << m[i] << " = " << valeur << endl;
          }
        }
      }
      catch (const boost::bad_expression& e)
      {
        std::cout << "Ce n'est pas une expression régulière valide : " 
                      << e.what()
                     << endl;
        }
       catch (...)
      {
        std::cout << "Etrange une exception inattendue" << endl;
      }
    ..
    }

  13. #13
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 25
    Points : 18
    Points
    18
    Par défaut librairie standard ?
    Bonjour,

    Je trouve ce code élégant en effet. Je ne savais pas qu'on peut retrouver l'aisance du PERL avec les expressions regulieres en C++.

    Ma question est : Est ce que ces deux fichiers boost/* appartiennent à la librairie standard du C++ ?

    Merci

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 38
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par flyfrog
    Bonjour,
    Je trouve ce code élégant en effet. Je ne savais pas qu'on peut retrouver l'aisance du PERL avec les expressions regulieres en C++.

    Ma question est : Est ce que ces deux fichiers boost/* appartiennent à la librairie standard du C++ ?
    Merci
    Pas dans le standard actuel (c.f. http://boost.org)

  15. #15
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Il y a aussi avec les stringstream et getline, je crois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    stringstream s;
    s << "127.0.0.1";
    string tmp;
    while(getline(s,tmp,'.'))
    {
    // tu convertis et stocke...
    }

  16. #16
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Il y a aussi un algorithme split() pour les chaînes de caractères dans boost.

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Points : 171
    Points
    171
    Par défaut
    Ou quelque chose de ce style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    std::istringstream ip("127.0.0.1");
    int v1,v2,v3,v4; 
    char point='.';
    ip>>v1>>point>>v2>>point>>v3>>point>>v4 ;

  18. #18
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Luther13 > le code que j'ai donné "reprend" le tien en mieux, et plus facile à écrire.

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Points : 171
    Points
    171
    Par défaut
    Citation Envoyé par Alp
    Luther13 > le code que j'ai donné "reprend" le tien en mieux, et plus facile à écrire.
    On a visiblement pas la même notion de la simplicité
    J'avoue que ma solution est uniquement specifique au cas present.

  20. #20
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    En effet ... alors qu'avec la portion donnée, tu peux en faire qqch de très générique.

Discussions similaires

  1. Décomposer une String en array<String^>
    Par ben_ghost dans le forum C++/CLI
    Réponses: 4
    Dernier message: 09/08/2006, 15h26
  2. [DOM] parser une String pour en faire un document XML
    Par Fladnag dans le forum Format d'échange (XML, JSON...)
    Réponses: 9
    Dernier message: 29/03/2004, 11h04
  3. [Débutant][JSP] Ajout des caractères à une String...
    Par Henkyl dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 04/03/2004, 16h30
  4. [Syntaxe] mettre des ' dans une string ?
    Par souch dans le forum Débuter
    Réponses: 4
    Dernier message: 14/08/2003, 16h26
  5. Réponses: 6
    Dernier message: 24/07/2003, 12h39

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