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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    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
    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 : 43
    Localisation : France, Pyr�n�es Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810

  4. #4
    Membre confirm�
    Inscrit en
    D�cembre 2005
    Messages
    134
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2005
    Messages : 134
    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 : 43
    Localisation : France, Pyr�n�es Atlantiques (Aquitaine)

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

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

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Par d�faut
    Merci beaucoup !

  7. #7
    Membre confirm�
    Inscrit en
    D�cembre 2005
    Messages
    134
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2005
    Messages : 134
    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
    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

  9. #9
    Membre confirm�
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    38
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 38
    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;
      }
    ..
    }

  10. #10
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    25
    D�tails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 25
    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

  11. #11
    Membre confirm�
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    38
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 38
    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)

  12. #12
    Alp
    Alp est d�connect�
    Expert confirm�

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    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...
    }

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