How to remove all the occurrences of a char in c++ string

C++Stl

C++ Problem Overview


I am using following:

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

But this is giving compilation error.

C++ Solutions


Solution 1 - C++

Basically, replace replaces a character with another and '' is not a character. What you're looking for is erase.

See this question which answers the same problem. In your case:

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

Or use boost if that's an option for you, like:

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

All of this is well-documented on reference websites. But if you didn't know of these functions, you could easily do this kind of things by hand:

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];

Solution 2 - C++

The algorithm std::replace works per element on a given sequence (so it replaces elements with different elements, and can not replace it with nothing). But there is no empty character. If you want to remove elements from a sequence, the following elements have to be moved, and std::replace doesn't work like this.

You can try to use std::remove() together with str.erase()1 to achieve this.

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

Solution 3 - C++

Using copy_if:

#include <string>
#include <iostream>
#include <algorithm>
int main() {
    std::string s1 = "a1a2b3c4a5";
    std::string s2;
    std::copy_if(s1.begin(), s1.end(), std::back_inserter(s2),
         [](char c){ 
                std::string exclude = "a";
                return exclude.find(c) == std::string::npos;}
    );

    std::cout << s2 << '\n';
    return 0;
}

Solution 4 - C++

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;
}

This is how I did it.

Or you could do as Antoine mentioned:

> See this > question > which answers the same problem. In your case: > > #include > str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());

Solution 5 - C++

Starting with C++20, std::erase() has been added to the standard library, which combines the call to str.erase() and std::remove() into just one function:

std::erase(str, 'a');

The std::erase() function overload acting on strings is defined directly in the <string> header file, so no separate includes are required. Similiar overloads are defined for all the other containers.

Solution 6 - C++

This code removes repetition of characters i.e, if the input is aaabbcc then the output will be abc. (the array must be sorted for this code to work)

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;

Solution 7 - C++

In case you have a predicate and/or a non empty output to fill with the filtered string, I would consider:

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

In the original question the predicate is [](char c){return c != 'a';}

Solution 8 - C++

Based on other answers, here goes one more example where I removed all special chars in a given string:

#include <iostream>
#include <string>
#include <algorithm>

std::string chars(".,?!.:;_,!'\"-");

int main(int argc, char const *argv){

  std::string input("oi?");
  std::string output = eraseSpecialChars(input);   
    
 return 0;
}




std::string eraseSpecialChars(std::string str){

std::string newStr;
    newStr.assign(str);  

    for(int i = 0; i < str.length(); i++){
        for(int  j = 0; j < chars.length(); j++ ){
            if(str.at(i) == chars.at(j)){
                char c = str.at(i);
                newStr.erase(std::remove(newStr.begin(), newStr.end(), c), newStr.end());
            }
        }
          
    }      

return newStr; 
}

Input vs Output:

Input:ra,..pha
Output:rapha

Input:ovo,
Output:ovo

Input:a.vo
Output:avo

Input:oi?
Output:oi

Solution 9 - C++

I have a string being read:

"\"internet\""

and I want to remove the quotes. I used the std::erase solution suggested above:

str.erase(std::remove(str.begin(), str.end(), '\"'), str.end());

but when I then did a compare on the result it failed:

if (str == "internet") {}

What I actually got was:

"internet "

The std::erase / std::remove solution doesn't shorten the string when it removes the end. I added this (from https://stackoverflow.com/a/21815483/264822):

str.erase(std::find_if(str.rbegin(), str.rend(), std::bind1st(std::not_equal_to<char>(), ' ')).base(), str.end());

to remove the trailing space(s).

Solution 10 - C++

I guess the method std:remove works but it was giving some compatibility issue with the includes so I ended up writing this little function:

string removeCharsFromString(const string str, char* charsToRemove )
{
    char c[str.length()+1]; // + terminating char
    const char *p = str.c_str();
    unsigned int z=0, size = str.length();
    unsigned int x;
    bool rem=false;

    for(x=0; x<size; x++)
    {
        rem = false;
        for (unsigned int i = 0; charsToRemove[i] != 0; i++)
        {
            if (charsToRemove[i] == p[x])
            {
                rem = true;
                break;
            }
        }
        if (rem == false) c[z++] = p[x];
    }

    c[z] = '\0';
    return string(c);
}

Just use as

> myString = removeCharsFromString(myString, "abc\r");

and it will remove all the occurrence of the given char list.

This might also be a bit more efficient as the loop returns after the first match, so we actually do less comparison.

Solution 11 - C++

This is how I do it:

std::string removeAll(std::string str, char c) {
	size_t offset = 0;
	size_t size = str.size();

	size_t i = 0;
	while (i < size - offset) {
		if (str[i + offset] == c) {
			offset++;
		}
		
		if (offset != 0) {
			str[i] = str[i + offset];
		}

		i++;
	}

    str.resize(size - offset);
	return str;
}

Basically whenever I find a given char, I advance the offset and relocate the char to the correct index. I don't know if this is correct or efficient, I'm starting (yet again) at C++ and i'd appreciate any input on that.

Solution 12 - C++

70% Faster Solution than the top answer

		void removeCharsFromString(std::string& str, const char* charsToRemove)
		{
            size_t charsToRemoveLen = strlen(charsToRemove);
			std::remove_if(str.begin(), str.end(), [charsToRemove, charsToRemoveLen](char ch) -> bool
				{
					for (int i = 0; i < charsToRemoveLen; ++i) {
						if (ch == charsToRemove[i])
							return true;
					}
					return false;
				});
		}

Solution 13 - C++

#include <string>
#include <algorithm>
std::string str = "YourString";
char chars[] = {'Y', 'S'};
str.erase (std::remove(str.begin(), str.end(), chars[i]), str.end());

Will remove capital Y and S from str, leaving "ourtring".

Note that remove is an algorithm and needs the header <algorithm> included.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDevesh AgrawalView Question on Stackoverflow
Solution 1 - C++AntoineView Answer on Stackoverflow
Solution 2 - C++leemesView Answer on Stackoverflow
Solution 3 - C++perrealView Answer on Stackoverflow
Solution 4 - C++Rafael ValleView Answer on Stackoverflow
Solution 5 - C++Kai PetzkeView Answer on Stackoverflow
Solution 6 - C++shivakrishna9View Answer on Stackoverflow
Solution 7 - C++jimifikiView Answer on Stackoverflow
Solution 8 - C++basquiatraphaeuView Answer on Stackoverflow
Solution 9 - C++parsley72View Answer on Stackoverflow
Solution 10 - C++DamienView Answer on Stackoverflow
Solution 11 - C++Ricardo PieperView Answer on Stackoverflow
Solution 12 - C++HelllRow StasView Answer on Stackoverflow
Solution 13 - C++HennoView Answer on Stackoverflow