Solved

[Very Easy & urgent] remove a char from a string

Posted on 2003-12-11
6
387 Views
Last Modified: 2010-04-01
I have a string in which some characters are repeated, I want to delete the repeated characters.

I have tried this:

       for (int l=0; l<strLettresChoisies.length(); l++)
           for (int m=0; m<strLettresChoisies.length(); m++)
               {
               if(tolower(strLettresChoisies[l])== tolower(strLettresChoisies[m]) )
                  {
                  char cLettreEffacer=tolower(strLettresChoisies[l]);
                  strLettresChoisies.remove(cLettreEffacer);
                  }
               }
also tried this:

       for (int l=0; l<strLettresChoisies.length(); l++)
           for (int m=0; m<strLettresChoisies.length(); m++)
               {
               if(tolower(strLettresChoisies[l])== tolower(strLettresChoisies[m]) )
                  {
                  char cLettreEffacer=tolower(strLettresChoisies[l]);
                  strLettresChoisies.erase(cLettreEffacer,1);
                  }
               }

But none of them makes the job!
Thanks!
0
Comment
Question by:philip_khalil
6 Comments
 
LVL 1

Expert Comment

by:meow00
ID: 9921521
Hello ... would u mind posting the whole code ? Thanks !
0
 

Author Comment

by:philip_khalil
ID: 9921529
*** non-relevant personal information removed on request of Asker by Netminder, Site Admin ***

# include <iostream.h>
# include <conio.h>
# include <iomanip.h>
# include <fstream.h>
# include <windows.h>
# include <stdlib.h>
# include <string.h>
#include <algorithm>

//Fonction permettant de remplir les variables contenants les noms complets,
// les pointages et le nombre de nom complet entrés.
void RemplirNomPointage(int &iNbNomComplet, string strLesNomComplets[20],
                        int iLesPointages[20]);

//Fonction permettant de remplir la variable contenants les 30 mots
void RemplirMot(string strLesMot[30]);

//Fonction permettant de transférer vers le fichier les noms complets,
// les pointages et le nombre de nom complet entrés.
void EnregistrerNomPointage(int iNbNomComplet, string strLesNomComplets[20],
                            int iLesPointages[20]);

//---------------------------------------------------------------------------

void main(void)
{
//Déclaration des constantes
const int NB_MOT = 30;

//Déclaration des variables
string strLesNomComplets[20]; //(prénom + ", " + nom)
int iLesPointages[20];
int iNbNomComplet;
string strLesMots[NB_MOT];


//Remplir la variable des NomComplet (Prenom+""+Nom) et des pointages à partir
//du fichier
RemplirNomPointage(iNbNomComplet, strLesNomComplets, iLesPointages);

//Remplir la variable des mots du fichier
RemplirMot(strLesMots);




//*****************************************************************************
//*************************** Début du Code ***********************************
//*****************************************************************************
//------------------------- identification VARIABLES --------------------------
int iMembre=0, iNbLettres, iLongueur, iRestant, iTemp;
char cLettre;
bool bOK=0, bTrouve=0, bAjoute=0, bPasse=0, bRepete=0, bRecommencer=0;
//------------------------- identification CONSTANTES -------------------------
//const float cfMaxX=30;
string strPhrase="", strNomJoueur, strMotActuel, strMotComplet,
       strLettresChoisies="", strTemp;
//------------------------- LECTURE du Mot de Passe ---------------------------

gotoxy(19,10);
cout<<" Veuillez entrer votre nom :";
getline (cin, strNomJoueur);
while (strNomJoueur=="")
      {
      gotoxy(48,10);
      getline (cin, strNomJoueur);
      }
clrscr();

srand(unsigned(time(NULL)));
strMotComplet = strLesMots[rand()%30];


for (int i=0; i<strMotComplet.length()-1; i++)
   {
       strMotComplet[i] = tolower(strMotComplet[i]);
   }

iRestant = strMotComplet.length();
iLongueur = strMotComplet.length();
//----------------------- Affiche la potence ----------------------------------
cout<<"Bonne chance " <<strNomJoueur <<" " <<strMotComplet <<"\n\n"
    <<"\t\t\t\xC9\xCD\xCD\xCD\xBB\n"
    <<"\t\t\t\xBA\n"
    <<"\t\t\t\xBA\n"
    <<"\t\t\t\xBA\n"
    <<"\t\t\t\xBA\n"
    <<"\t\t\t\xBA\n"
    <<"\t\t\t\xBA\n"
    <<"\t\t     \xCD\xCD\xCD\xCA\xCD\xCD\xCD";


gotoxy(19,14);
cout<<"Votre mot contient " <<strMotComplet.length() <<" Lettre(s) tous sans accents";
//-------------- Affiche les espaces du nombre de lettres du mot --------------
gotoxy(19,16);
for (int p=0; p<strMotComplet.length(); p++)
cout<<"_ ";

gotoxy(19,20);
cout<<"Veuillez entrer une lettre :";

gotoxy(19,25);
cout<<"Lettre(s) choisie(s) :";

//--Manche continue tant que Mot n'est pas Complet et qu'il reste des membres--
while ( (iRestant!=0) && (iMembre<7) )
    {
//------------------------------------------------------------------------------
    for (int p=0; p<strLettresChoisies.length(); p++)
        {
            if (strMotComplet[0]==strLettresChoisies[p] && bRepete==0)                 //Boucle importante
               {
               strLettresChoisies[p]= toupper(strLettresChoisies[p]);
               gotoxy(19,16);
               cout<<strLettresChoisies[p];
               bRepete=1;
               }
        }

    gotoxy(47,20);
//---- Demande une lettre tant que l'usager n'en rentre d'autres caracteres ---
    cLettre = getche();
    cLettre = tolower(cLettre);

    if (cLettre >='a' && cLettre <='z')
       {
//--------------- Vérifie si la lettre n'a pas déjà été choisie ---------------

       for(int i=0; i<strLettresChoisies.length(); i++)
           {

           if (tolower(strLettresChoisies[i])==cLettre)                                                      
              {                                                                                              
              MessageBox(NULL, "Vous avez déjà choisi cette lettre!", "Attention", MB_OK|MB_ICONSTOP);      
              gotoxy(47,20);                                                                                
              cout<<" ";                                                                                    
              gotoxy(47,20);
              i =    strLettresChoisies.length(); //Finit la boucle
              //bRecommencer = 1;
              }
           }

//-------- Ajoute la lettre aux lettres déjà choisies et les affichent --------
       strLettresChoisies+=cLettre;
//------------------------ Efface la lettre répétée ---------------------------
       for (int l=0; l<strLettresChoisies.length(); l++)
           for (int m=0; m<strLettresChoisies.length(); m++)
               {
               if(tolower(strLettresChoisies[l])== tolower(strLettresChoisies[m]) )
                  {
                  char cLettreEffacer=tolower(strLettresChoisies[l]);
                  strLettresChoisies.erase(cLettreEffacer,1);
                  }
               }
       gotoxy(47,20);
       cout<<" ";
       gotoxy(41,25);
       cout <<strLettresChoisies;
//------------------ Vérification de la LETTRE dans le MOT --------------------
    bOK=0;
    for(int p=0; p<strMotComplet.length() && bTrouve==0 ; p++)
       {
//------------ Sort de la boucle si toutes les lettres sont trouvées ----------
       if (iRestant == 0)
          {
          bTrouve=1;
          //cout<<"\a"; //BEEP 1 fois
          //Sleep (400); //Attend 0.4 secondes
          //cout<<"\a\a\a";
          //Sleep (500);
          //cout<<"\a";
          //Sleep (700);
          //cout<<"\a";
          //Sleep (400);
          //cout<<"\a";
          }
//--------------------- Si la lettre se trouve dans le mot --------------------
       if (cLettre==tolower(strMotComplet[p]))
          {
          gotoxy(19+(p*2), 16);
          cout<< cLettre;
          iRestant--;
          bOK=1;  //Il y a au moins une bonne lettre si bOK = 1
          }
//Si la lettre ne s'y trouve pas et que tout le mot est vérifié: AJOUTE un MEMBRE
       else if ( cLettre!=strMotComplet[p] && p>=strMotComplet.length()-1 && bOK==0)
          {
          switch(iMembre)
              {
              case 0: gotoxy(5,3);
                      cout<<"\t\t\t\xC9\xCD\xCD\xCD\xBB";
                      gotoxy(5,4);
                      cout<<"\t\t\t\xBA   O";
                      iMembre++;
                      break;

              case 1: gotoxy(5,5);
                      cout<<"\t\t\t\xBA   \xCF";
                      iMembre++;
                      break;

              case 2: gotoxy(5,5);
                      cout<<"\t\t\t\xBA  \xD5\xCF";
                      iMembre++;
                      break;

              case 3: gotoxy(5,5);
                      cout<<"\t\t\t\xBA  \xD5\xCF\xB8";
                      iMembre++;
                      break;

              case 4: gotoxy(5,6);
                      cout<<"\t\t\t\xBA   \xBA";
                      iMembre++;
                      break;

              case 5: gotoxy(5,7);
                      cout<<"\t\t\t\xBA  /";
                      iMembre++;
                      break;

              case 6: gotoxy(5,3);
                      cout<<"\t\t\t\xC9\xCD\xCD\xCD\xBB   Oups!\a\a\a"; //BEEP 3 fois
                      gotoxy(5,7);
                      cout<<"\t\t\t\xBA  / \\";
                      iMembre++;
                      break;
              }

          }
       }
    }
}

using std::string;
strMotComplet[0]=toupper(strMotComplet[0]);
strMotComplet = "Le mot était : " + strMotComplet;

if (iMembre==7)
   MessageBox(0,strMotComplet.data(),"Désolé",MB_OK);
if (bTrouve==1)
   MessageBox(NULL, "Vous avez bien trouvé le mot!", "Bravo", MB_OK|MB_ICONSTOP);
clrscr();
//------------------------------ Pointage -------------------------------------
bAjoute=0;
for (int p=0; p<iNbNomComplet; p++)
   {
   if(strLesNomComplets[p] == strNomJoueur)    //Si l'enregistrement existe on incremente
       {
       iLesPointages[p]++;
       p = iNbNomComplet;
       bAjoute=1;
       }
   else if (p == iNbNomComplet-1 && bAjoute ==0)
       {
       strLesNomComplets[iNbNomComplet] = strNomJoueur;
       iLesPointages[iNbNomComplet]=0;
       iNbNomComplet++;
       bAjoute=1;
       }
   }
//------------------- Classement par ordre Alphanumérique ---------------------
for (int i=0; i<iNbNomComplet; i++)
    for (int p=0; p<iNbNomComplet; p++)
        if (strLesNomComplets[i]<strLesNomComplets[p])
        {
        strTemp= strLesNomComplets[i];
        strLesNomComplets[i] = strLesNomComplets[p];
        strLesNomComplets[p]= strTemp;
        iTemp= iLesPointages[i];
        iLesPointages [i] = iLesPointages [p];
        iLesPointages [p] = iTemp;
        }
//----------------------- Affiche les résultats valides -----------------------
for (int p=0; p<iNbNomComplet; p++)
    cout<<left<<setw(40)<<strLesNomComplets[p]<<" "<<iLesPointages[p]<<'\n';

cout<<"Pesez une touche pour terminer";

//*****************************************************************************
//***************************** Fin du Code ***********************************
//*****************************************************************************
//Fonction permettant transférer vers le ficheir les noms complets,
// les pointages et le nombre de nom complet entrés.
EnregistrerNomPointage(iNbNomComplet, strLesNomComplets, iLesPointages);
}


//---------------------------------------------------------------------------
//Section des fonctions, ne rien écrire dans cette section
//---------------------------------------------------------------------------

//Fonction permettant de remplir les variables contenants les noms complets,
// les pointages et le nombre de nom complet entrés.v
void RemplirNomPointage(int &iNbNomComplet, string strLesNomComplets[20],
                        int iLesPointages[20])
    {
    fstream Fichier;
    Fichier.open("c:\\temp\\NomPointage.bin", ios::in|ios::binary);
    Fichier.read((char*) &iNbNomComplet, sizeof(iNbNomComplet));
    for(int i=0; i<iNbNomComplet; i++)
        {
        char cMot[90];
        Fichier.read((char*) cMot, sizeof(cMot));
        strLesNomComplets[i] = cMot;
        Fichier.read((char*)&iLesPointages[i], sizeof(iLesPointages[i]));
        }
    Fichier.close();
    }

//Fonction permettant de remplir la variable contenants les 30 mots
void RemplirMot(string strLesMot[30])
    {
    fstream Fichier;
    Fichier.open("c:\\temp\\Mot.txt", ios::in);
    for(int i=0; i<30; i++)
        {
        Fichier>>strLesMot[i];
        }
    Fichier.close();
    }

//Fonction permettant transférer vers le fichier les noms complets,
// les pointages et le nombre de nom complet entrés.
void EnregistrerNomPointage(int iNbNomComplet, string strLesNomComplets[20],
                            int iLesPointages[20])
    {
    fstream Fichier;
    Fichier.open("c:\\temp\\NomPointage.bin", ios::out|ios::binary);
    Fichier.write((char*) &iNbNomComplet, sizeof(iNbNomComplet));
    for(int i=0; i<iNbNomComplet; i++)
        {
        char cMot[90];
        strcpy(cMot, strLesNomComplets[i].c_str());
        Fichier.write((char*) cMot, sizeof(cMot));
        Fichier.write((char*)&iLesPointages[i], sizeof(iLesPointages[i]));
        }
    Fichier.close();
    getch();
    }
0
 
LVL 11

Expert Comment

by:Agarici
ID: 9921690
i get it you are using stl...
first i would suggest removing the '.h' from the include of the stl headers( i mean use '#include <string>' instead)

why dont you use the erase method of the string object?
so i would do something like this:

for( int i = 0,k,n =str.length()   ; i < n ; i++ )
{
 k = str.find_first_of( str[i], i+1 );
 if(k!=n)str.erase( k,1 );
 n = str.length() ;
}


hope this helps

A.

0
Live: Real-Time Solutions, Start Here

Receive instant 1:1 support from technology experts, using our real-time conversation and whiteboard interface. Your first 5 minutes are always free.

 
LVL 11

Accepted Solution

by:
Agarici earned 100 total points
ID: 9921735
hmm...

ofcourse the above will erase only the first repeated letter, sorry
to erase all you will have to insert a while block like this:

for( int i = 0,k,n =str.length()   ; i < n ; i++ )
{
 k = str.find_first_of( str[i], i+1 );
 while(k!=n){
  str.erase( k,1 );
  k = str.find_first_of( str[i], k );
 }
  n = str.length() ;
}

A.
0
 
LVL 17

Expert Comment

by:rstaveley
ID: 9921976
Here's an STL-ish way to remove repeat characters:
--------8<--------
#include <iostream>
#include <string>
#include <algorithm>

int main()
{
      std::string str("Heeeelllllooooo WWoooooorlllddd");
      std::string::iterator end = unique(str.begin(),str.end());
      copy(str.begin(),end,std::ostream_iterator<char>(std::cout));
      std::cout << '\n';
}
--------8<--------
Sorry if I've misread your requirement :-)
0
 
LVL 11

Expert Comment

by:Agarici
ID: 9928556

rstaveley:

very nice code! the problem is it only removes consecutive repeated characters ( i mean the 'l' and 'o' from 'World' are not removed and the string stil contains duplicate chars - and it seamed to me that philip_khalil wants to remove all duplicates from the string )

philip_khalil:

if you only want to transform "aaaabbbbaaaacccc" into "abac" (and not into "abc") you should use the solution rstaveley proposed, it is a (much) better solution.


A.
0

Featured Post

Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

This article shows you how to optimize memory allocations in C++ using placement new. Applicable especially to usecases dealing with creation of large number of objects. A brief on problem: Lets take example problem for simplicity: - I have a G…
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

776 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question