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 :

Vérification et découpage d'une string


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 26
    Points
    26
    Par défaut Vérification et découpage d'une string
    Bonjour à tous,
    j'ai besoin pour mon application que l'utilisateur entre une chaîne du type :
    (A) Element_X, (B) Element_Y
    ou indifféremment
    (B) Element_Y, (A) Element_X

    J'ai cette chaîne sous la forme d'une std::string.
    L'important est :
    - qu'il y ait une et une seule virgule (qui sert de séparateur)
    - que d'un côté de la virgule il y ait une seule fois la chaîne "(A)" et de l'autre une seule fois la chaîne "(B)", peu importe l'ordre comme indiqué au-dessus

    Comment avec les méthodes de string vérifier que ma chaîne est bien de cette forme ?

    Puis dans un second temps je souhaite associer Element_X à une string chA et Element_Y à une string chB, tout cela en ayant viré les blancs.

    Y a-t-il moyen de faire tout ceci juste avec les méthodes de string ?

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 26
    Points
    26
    Par défaut
    Euh, je dois faire tout ceci sans boost ni aucune autre librairie...

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Hello,

    Les fonctions de la class string te permettent de faire ce que tu veux :

    http://www.cplusplus.com/reference/string/string/

    find pour vérifier que ta chaîne est au bon format / qu'il n'y a pas d'occurences en double, substr pour récupérer les sous chaînes qui t'intéressent.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 26
    Points
    26
    Par défaut
    Pour la vérification de la forme j'ai écrit ceci...
    Code C++ : 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
    bool CAISBasicDoc::estValide(std::string &str)
    	{
    	size_t found,found2,found3,found4,found5,found6;
    	found = str.find(",");
    	if(found==string::npos)
    		return false;
    	else 
    		{
    		found2 = str.find(",",found+1);
    		if(found2!=string::npos)
    			return false;
    		else 
    			{
    			found3 = str.find("(A)");
    			found4 = str.find("(B)");
    			if(
    			   found3 == string::npos 
    			   || 
    			   found4 == string::npos 
    			   || 
    			   !((0 <= found3 && found3 < found && found4 > found && found4 < str.length()) || (0 <= found4 && found4 < found && found3 > found && found3 < str.length()))
    			   )
    			return false;
    			else
    				{
    				found5 = str.find("(A)",found3+1);
    		    	found6 = str.find("(B)",found4+1);
    				if(found5!=string::npos || found6!=string::npos)
    					return false;
    				}
    			}
    		}
    	return true;
    	}

    C'est un peu lourd, mais bon...
    Qu'en pensez-vous ?

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    C'est pour ça que boost a développé des lib traitant les chaînes de caractères (tokenizer et RegEx)

    Sinon ton code fait ce qu'il faut, par contre récupérer les positions des différentes sous chaînes (par paramètre dans ta fonction par exemple) t'évitera de faire le boulot en double quand tu devras t'occuper du traitement.

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Et un tuto sur Boost::Regex en C++ : Utilisation de Boost.Regex
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Membre régulier Avatar de Chessmaster1966
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Points : 74
    Points
    74
    Par défaut
    voici l'algorithme :

    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
     
    VAR :
    	CAR ChaineEntree[255]
    	CHAINE chA, chB	
    	ENTIER  N, Position, Longueur	
    STRUCT :
    FONC :	
    	DEBUT
    		ECRIRE "Saisissez une chaîne au format suivant (ValeurX,ValeurY)"
    		LIRE ChaineEntree		
     
    		// Vérifie le format de la chaîne
    		Longueur <- LongueurChaine(ChaineEntree)
    		Position <- -1
    		SI Longueur > 0 ALORS
    			POUR N <- 0 A Longueur - 1 FAIRE
    				SI ChaineEntree[N] = " " OU (ChaineEntree[N] = ',' ET Position <> -1)  ALORS								
    					Position <- -1
    					SORTIRPOUR
    				SINONSI (N > 0 ET ChaineEntree[N] = ',') ET Position = -1 ALORS
    					Position <- N				
    				FINSI			
    			FINPOUR			
    		FINSI		
     
     
    		SI Position > 0 ALORS			
    			// Décompose la chaîne.
    			POUR N <- 0 A Position-1 FAIRE
    				chA <- chA + ChaineEntree[N]
    			FINPOUR
     
    			POUR N <- Position + 1 A Longueur -1 FAIRE
    				chB <- chB + ChaineEntree[N]
    			FINPOUR
     
    			ECRIRE "L'objet chA vaut '", chA, "' et l'objet chB vaut '", chB, "'."
    		SINON
    			ECRIRE "Erreur: La chaîne n'est pas au bon format."
    		FINSI				
     
    	FIN
    Le bonheur est sans raison

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 26
    Points
    26
    Par défaut
    Merci mais cet algo n'est pas complet dans le sens où il ne vérifie pas certaines conditions et qu'il ne traîte pas le cas (B) Element_Y, (A) Elément_X
    Sinon j'ai écrit ce bout de code pour construire chA et chB, qu'en pensez-vous ?
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    size_t foundA = str.find("(A)");
    size_t foundB = str.find("(B)");
    size_t foundv = str.find(",");
     
    if(foundA < foundB)
    	{
    	chA = str.substr(foundA + 3, foundv - foundA - 3);
    	chB = str.substr(foundB + 3);
    	}
    else
    	{
    	chA = str.substr(foundA + 3);
    	chB = str.substr(foundB + 3, foundv - foundB - 3);
    	}
    Je souhaite virer les blancs au début et à la fin de chA et chB, comment faire ?

    EDIT : comme ça
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //suppression des blancs en début et fin de chaîne
    		chA = chA.substr(chA.find_first_not_of(" "));
    		size_t found1 = chA.find_last_not_of(" ");
    		if(found1!=string::npos)
    			chA.erase(found1 + 1);
     
     
    		chB = chB.substr(chB.find_first_not_of(" "));
    		size_t found2 = chB.find_last_not_of(" ");
    		if(found2!=string::npos)
    			chB.erase(found2 + 1);

  10. #10
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 26
    Points
    26
    Par défaut
    Alors je n'ai plus qu'un souci à régler, c'est la vérification qu'on n'est pas dans le cas "(A) , (B) " ou le contraire, ou encore "(A) , (B) ", etc.
    Bref je dois vérifier qu'il y a bien au moins un caractère derrière (A) et (B)....
    Pour l'instant ma vérif est comme ceci :
    Code C++ : 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
     
    bool CAISBasicDoc::estValide(std::string &str)
    	{
    	size_t found,found2,found3,found4,found5,found6;
    	found = str.find(",");
    	if(found==string::npos)
    		return false;
    	else 
    		{
    		found2 = str.find(",",found+1);
    		if(found2!=string::npos)
    			return false;
    		else 
    			{
    			found3 = str.find("(A)");
    			found4 = str.find("(B)");
    			if(
    			   found3 == string::npos 
    			   || 
    			   found4 == string::npos 
    			   || 
    			   !((0 <= found3 && found3 + 3 < found && found4 > found && found4 + 3 < str.length()) || (0 <= found4 && found4 + 3 < found && found3 > found && found3 + 3 < str.length()))
    			   )
    			return false;
    			else
    				{
    				found5 = str.find("(A)",found3+1);
    		    	found6 = str.find("(B)",found4+1);
    				if(found5!=string::npos || found6!=string::npos)
    					return false;
    				}
    			}
    		}
    	return true;
    	}
    Une âme charitable pour me donner un coup de co(u)de ?

  11. #11
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 26
    Points
    26
    Par défaut
    Bon j'ai tout regroupé dans une seule méthode, c'est bourrin mais ça marche nickel...tout est vérifié, je crois que je n'ai rien oublié ! Je file le code pour d'éventuels intéressés
    Code C++ : 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
     
    /*
    méthode qui vérifie la validité de la chaîne rentrée par l'utilisateur et si possible construit chA et chB
    */
    void CAISBasicDoc::parsage(const string str,string &souschA,string &souschB, bool &estValide)
    	{
    	estValide = true;
    	size_t foundv,foundvdouble,foundA,foundB,foundAdouble,foundBdouble,foundspaceA,foundspaceB,found1,found2;
    	foundv = str.find(",");
    	if(foundv==string::npos) 
    		estValide = false;
    	else 
    		{
    		foundvdouble = str.find(",",foundv+1);
    		if(foundvdouble!=string::npos)
    			estValide = false;
    		else 
    			{
    			foundA = str.find("(A)");
    			foundB = str.find("(B)");
    			if(
    				foundA == string::npos 
    				|| 
    				foundB == string::npos 
    				|| 
    				!((0 <= foundA && foundA + 3 < foundv && foundB > foundv && foundB + 3 < str.length()) || (0 <= foundB && foundB + 3 < foundv && foundA > foundv && foundA + 3 < str.length()))
    				)
    				estValide = false;
    			else
    				{
    				foundAdouble = str.find("(A)",foundA+1);
    				foundBdouble = str.find("(B)",foundB+1);
    				if(foundAdouble!=string::npos || foundBdouble!=string::npos)
    					estValide = false;
    				else 
    					{
    					if(0 <= foundA && foundA + 3 < foundv && foundB > foundv && foundB + 3 < str.length())
    						{
    						souschA = str.substr(foundA + 3, foundv - foundA - 3);
    						souschB = str.substr(foundB + 3);
    						}
    					else
    						{
    						souschA = str.substr(foundA + 3);
    						souschB = str.substr(foundB + 3, foundv - foundB - 3);
    						}
     
    					foundspaceA = souschA.find_last_not_of(" ");
    					foundspaceB = souschB.find_last_not_of(" ");
    					if (foundspaceA==string::npos || foundspaceB==string::npos) 
    						estValide = false; 
    					else
    						{
    						souschA = souschA.substr(souschA.find_first_not_of(" "));
    						found1 = souschA.find_last_not_of(" ");
    						if(found1!=string::npos)
    							souschA.erase(found1 + 1);
     
    						souschB = souschB.substr(souschB.find_first_not_of(" "));
    						found2 = souschB.find_last_not_of(" ");
    						if(found2!=string::npos)
    							souschB.erase(found2 + 1);
    						}
    					}
    				}
    			}
    		}
    	}

  12. #12
    Membre régulier Avatar de Chessmaster1966
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Points : 74
    Points
    74
    Par défaut
    A régliss76 :

    Pourquoi te compliques tu la vie à vouloir saisir des valeurs puis vérifier (A) et (B) et mettre dans le bon objet la valeur correspondante. En programmation il faut veillez à aller toujours au plus simple, du moins c'est mon avis !

    L'algo que j'ai posté est effectivement incomplet je n'ai pas évalué tous les cas de figures, c'était juste pour te donner la voie et toi de le compléter ceci dit je met l'algo dans son intégralité et il fonctionne correctement en prenant en charge tous les cas de figures.

    Mais je le rappelle il vaut mieux s'obliger à demander à l'utilisateur de saisir directement une chaîne au bon format comme par exemple et je le demande dans mon algo : "ObjetX,ObjetY" tu sais que la première valeur est pour X et la deuxième pour Y il n'y a aucun souci alors pourquoi se compliquer la vie en demandant l'info de cette façon : "(A)ObjetX,(B)ObjetY" et donner la possibiliter de saisir : "(B)ObjetY,(A)ObjetX" ???

    Donc voici l'intégralité de l'algorithme :

    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
     
    NOM : TestFormatAndSplit
    ROLE :
    	Demander à l'utilisateur d'entrée une chaîne au format "ValeurX,ValeurY".
    	1) Vérifier que la chaîne est au bon format.
    	2) Si elle n'est pas au bon format afficher un message d'erreur.
    	3) Décomposer et affecter ValeurX à un objet chA et ValeurY à un objet chB
    	4) Afficher les résultats.
    ENTREE :	
    SORTIE :		
    CONST :
    	ENTIER cMax <- 255 
    VAR :
    	CAR ChaineEntree[cMax]	
    	ENTIER  N, Position, Longueur	
    	CHAINE chA, chB	
    STRUCT :
    FONC :	
    	ENTIER LongueurChaine( CAR Chaine[])
     
    	DEBUT
    		ECRIRE "Saisissez une chaîne au format suivant ('ValeurX,ValeurY')"
    		LIRE ChaineEntree		
     
    		// Vérifie le format de la chaîne
    		Longueur <- LongueurChaine(ChaineEntree)
    		Position <- -1
    		POUR N <- 0 A Longueur - 1 FAIRE
    			SI (ChaineEntree[N] = ',' ET N = 0) OU				 
       			   (ChaineEntree[N] = ',' ET N+1 = Longueur) OU
    			   (ChaineEntree[N] = ',' ET Position > -1) OU			   
                    ChaineEntree[N] = ' '  ALORS 
    				Position <- -1  
    				SORTIRPOUR
    			SINONSI ChaineEntree[N] = ',' ALORS
    				Position <- N				
    			FINSI			
    		FINPOUR					
     
    		SI Position > -1 ALORS			
    			// Décompose la chaîne.
    			chA <-""
    			POUR N <- 0 A Position-1 FAIRE
    				chA <- chA + ChaineEntree[N]
    			FINPOUR
     
    			chB <- ""
    			POUR N <- Position + 1 A Longueur -1 FAIRE
    				chB <- chB + ChaineEntree[N]
    			FINPOUR
     
    			ECRIRE "L'objet chA vaut '", chA, "' et l'objet chB vaut '", chB, "'."
    		SINON
    			ECRIRE "Erreur: La chaîne n'est pas au bon format."
    		FINSI				
     
    	FIN
    Le bonheur est sans raison

  13. #13
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 26
    Points
    26
    Par défaut
    Mais je le rappelle il vaut mieux s'obliger à demander à l'utilisateur de saisir directement une chaîne au bon format comme par exemple et je le demande dans mon algo : "ObjetX,ObjetY" tu sais que la première valeur est pour X et la deuxième pour Y il n'y a aucun souci alors pourquoi se compliquer la vie en demandant l'info de cette façon : "(A)ObjetX,(B)ObjetY" et donner la possibiliter de saisir : "(B)ObjetY,(A)ObjetX" ???
    En fait, tout ceci vient du fait que ma chaîne est une chaîne produite par un logiciel et que l'utilisateur n'aura qu'à la copier/coller dans mon application.
    Le logiciel peut produire aussi bien "(A)ObjetX,(B)ObjetY" que "(B)ObjetY,(A)ObjetX" ou pourquoi pas "(A) Objet X , (B) Objet Y".
    Donc tout ce boulot c'est pour éviter à l'utilisateur de remettre la chaîne dans un format précis ! C'est une de mes contraintes, donc je l'ai respectée, je ne me suis pas compliqué la vie pour mon bon plaisir !!!

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 02/04/2015, 11h28
  2. Vérification des caractères dans une string
    Par julielanglois dans le forum Général VBA
    Réponses: 2
    Dernier message: 01/06/2009, 19h48
  3. Découpage d'une string
    Par DarkLeon dans le forum Windows Forms
    Réponses: 1
    Dernier message: 11/02/2009, 16h27
  4. Découpage d'une String
    Par Macareux dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 03/12/2008, 18h39
  5. Découpage d'une string
    Par metalcoyote dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 24/01/2007, 16h49

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