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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Inscrit en
    Mai 2007
    Messages
    79
    D�tails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    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 confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

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

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 504

  3. #3
    Membre confirm�
    Inscrit en
    Mai 2007
    Messages
    79
    D�tails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par d�faut
    Euh, je dois faire tout ceci sans boost ni aucune autre librairie...

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

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    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
    Membre confirm�
    Inscrit en
    Mai 2007
    Messages
    79
    D�tails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    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 chevronn�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : France, Paris (�le de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    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 : 62
    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
    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 actif Avatar de Chessmaster1966
    Inscrit en
    Juillet 2010
    Messages
    63
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    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

  9. #9
    Membre confirm�
    Inscrit en
    Mai 2007
    Messages
    79
    D�tails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    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
    Membre confirm�
    Inscrit en
    Mai 2007
    Messages
    79
    D�tails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    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 ?

+ 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