web-dev-qa-db-fra.com

Comment supprimer toutes les occurrences d'un caractère dans une chaîne c ++

J'utilise ce qui suit:

replace (str1.begin(), str1.end(), 'a' , '')

Mais cela donne une erreur de compilation.

85
Devesh Agrawal

Fondamentalement, replace remplace un caractère par un autre et '' n'est pas un caractère. Ce que vous cherchez, c'est erase.

Voir cette question qui répond au même problème. Dans ton cas:

#include <algorithm>
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());

Ou utilisez boost si c'est une option pour vous, comme:

#include <boost/algorithm/string.hpp>
boost::erase_all(str, "a");

Tout cela est bien documenté sur référencesites Web . Mais si vous ne connaissiez pas ces fonctions, vous pourriez facilement faire ce genre de choses à la main:

std::string output;
output.reserve(str.size()); // optional, avoids buffer reallocations in the loop
for(size_t i = 0; i < str.size(); ++i)
  if(str[i] != 'a') output += str[i];
147
Antoine

L'algorithme std::replace fonctionne par élément sur une séquence donnée (il remplace donc des éléments par des éléments différents et ne peut pas le remplacer par rien ). Mais il n'y a pas de caractère vide . Si vous souhaitez supprimer des éléments d'une séquence, les éléments suivants doivent être déplacés et std::replace ne fonctionne pas comme cela.

Vous pouvez essayer d'utiliser std::remove ( avec std::erase ) pour y parvenir.

str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
8
leemes

Utiliser copy_if:

#include <string>
#include <iostream>
#include <algorithm>
int main() {
    std::string s1 = "a1a2b3c4a5";
    char s2[256];
    std::copy_if(s1.begin(), s1.end(), s2, [](char c){return c!='a';});
    std::cout << s2 << std::endl;
    return 0;
}
4
perreal
string RemoveChar(string str, char c) 
{
   string result;
   for (size_t i = 0; i < str.size(); i++) 
   {
          char currentChar = str[i];
          if (currentChar != c)
              result += currentChar;
   }
       return result;
}

Voici comment je l'ai fait.

Ou vous pourriez faire comme Antoine a mentionné:

Voir cette question qui répond au même problème. Dans ton cas:

#include <algorithm>
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
3
Rafael Valle

Si vous avez un predicate et/ou un output non vide à remplir avec la chaîne filtrée, je considérerais:

output.reserve(str.size() + output.size());  
std::copy_if(str.cbegin(), 
             str.cend(), 
             std::back_inserter(output), 
             predicate});

Dans la question initiale, le prédicat est [](char c){return c != 'a';}

1
jimifiki

Ce code supprime la répétition des caractères, c'est-à-dire que si l'entrée est aaabbcc, le résultat sera abc.

cin >> s;
ans = "";
ans += s[0];
for(int i = 1;i < s.length();++i)
if(s[i] != s[i-1])
    ans += s[i];
cout << ans << endl;
1
shivakrishna9