Remove spaces from std::string in C++

C++StringStlWhitespace

C++ Problem Overview


What is the preferred way to remove spaces from a string in C++? I could loop through all the characters and build a new string, but is there a better way?

C++ Solutions


Solution 1 - C++

The best thing to do is to use the algorithm remove_if and isspace:

remove_if(str.begin(), str.end(), isspace);

Now the algorithm itself can't change the container(only modify the values), so it actually shuffles the values around and returns a pointer to where the end now should be. So we have to call string::erase to actually modify the length of the container:

str.erase(remove_if(str.begin(), str.end(), isspace), str.end());

We should also note that remove_if will make at most one copy of the data. Here is a sample implementation:

template<typename T, typename P>
T remove_if(T beg, T end, P pred)
{
    T dest = beg;
    for (T itr = beg;itr != end; ++itr)
        if (!pred(*itr))
            *(dest++) = *itr;
    return dest;
}

Solution 2 - C++

std::string::iterator end_pos = std::remove(str.begin(), str.end(), ' ');
str.erase(end_pos, str.end());

Solution 3 - C++

From gamedev

string.erase(std::remove_if(string.begin(), string.end(), std::isspace), string.end());

Solution 4 - C++

Can you use Boost String Algo? http://www.boost.org/doc/libs/1_35_0/doc/html/string_algo/usage.html#id1290573

erase_all(str, " "); 

Solution 5 - C++

You can use this solution for removing a char:

#include <algorithm>
#include <string>
using namespace std;

str.erase(remove(str.begin(), str.end(), char_to_remove), str.end());

Solution 6 - C++

For trimming, use boost string algorithms:

#include <boost/algorithm/string.hpp>

using namespace std;
using namespace boost;

// ...

string str1(" hello world! ");
trim(str1);      // str1 == "hello world!"

Solution 7 - C++

Hi, you can do something like that. This function deletes all spaces.

string delSpaces(string &str) 
{
   str.erase(std::remove(str.begin(), str.end(), ' '), str.end());
   return str;
}
              

         

I made another function, that deletes all unnecessary spaces.

string delUnnecessary(string &str)
{
    int size = str.length();
    for(int j = 0; j<=size; j++)
    {
        for(int i = 0; i <=j; i++)
        {
            if(str[i] == ' ' && str[i+1] == ' ')
            {
                str.erase(str.begin() + i);
            }
            else if(str[0]== ' ')
            {
                str.erase(str.begin());
            }
            else if(str[i] == '\0' && str[i-1]== ' ')
            {
                str.erase(str.end() - 1);
            }
        }
    }
    return str;
}

Solution 8 - C++

string replaceinString(std::string str, std::string tofind, std::string toreplace)
{
        size_t position = 0;
        for ( position = str.find(tofind); position != std::string::npos; position = str.find(tofind,position) )
        {
                str.replace(position ,1, toreplace);
        }
        return(str);
}

use it:

string replace = replaceinString(thisstring, " ", "%20");
string replace2 = replaceinString(thisstring, " ", "-");
string replace3 = replaceinString(thisstring, " ", "+");

Solution 9 - C++

If you want to do this with an easy macro, here's one:

#define REMOVE_SPACES(x) x.erase(std::remove(x.begin(), x.end(), ' '), x.end())

This assumes you have done #include <string> of course.

Call it like so:

std::string sName = " Example Name ";
REMOVE_SPACES(sName);
printf("%s",sName.c_str()); // requires #include <stdio.h>

Solution 10 - C++

> c++ > #include <algorithm> > using namespace std; > > int main() { > . > . > s.erase( remove( s.begin(), s.end(), ' ' ), s.end() ); > . > . > } >


Source:

Reference taken from this forum.

Solution 11 - C++

In C++20 you can use free function std::erase

std::string str = " Hello World  !";
std::erase(str, ' ');

Full example:

#include<string>
#include<iostream>

int main() {
    std::string str = " Hello World  !";
    std::erase(str, ' ');
    std::cout << "|" << str <<"|";
}

I print | so that it is obvious that space at the begining is also removed.

note: this removes only the space, not every other possible character that may be considered whitespace, see https://en.cppreference.com/w/cpp/string/byte/isspace

Solution 12 - C++

I used the below work around for long - not sure about its complexity.

s.erase(std::unique(s.begin(),s.end(),[](char s,char f){return (f==' '||s==' ');}),s.end());

when you wanna remove character ' ' and some for example - use

s.erase(std::unique(s.begin(),s.end(),[](char s,char f){return ((f==' '||s==' ')||(f=='-'||s=='-'));}),s.end());

likewise just increase the || if number of characters you wanna remove is not 1

but as mentioned by others the erase remove idiom also seems fine.

Solution 13 - C++

string removeSpaces(string word) {
    string newWord;
    for (int i = 0; i < word.length(); i++) {
	    if (word[i] != ' ') {
		    newWord += word[i];
	    }
    }

    return newWord;
}

This code basically takes a string and iterates through every character in it. It then checks whether that string is a white space, if it isn't then the character is added to a new string.

Solution 14 - C++

Removes all whitespace characters such as tabs and line breaks (C++11):

string str = " \n AB cd \t efg\v\n";
str = regex_replace(str,regex("\\s"),"");

Solution 15 - C++

  string str = "2C F4 32 3C B9 DE";
  str.erase(remove(str.begin(),str.end(),' '),str.end());
  cout << str << endl;

output: 2CF4323CB9DE

Solution 16 - C++

Just for fun, as other answers are much better than this.

#include <boost/hana/functional/partial.hpp>
#include <iostream>
#include <range/v3/range/conversion.hpp>
#include <range/v3/view/filter.hpp>
int main() {
    using ranges::to;
    using ranges::views::filter;
    using boost::hana::partial;
    auto const& not_space = partial(std::not_equal_to<>{}, ' ');
    auto const& to_string = to<std::string>;

    std::string input = "2C F4 32 3C B9 DE";
    std::string output = input | filter(not_space) | to_string;
    assert(output == "2CF4323CB9DE");
}

Solution 17 - C++

I created a function, that removes the white spaces from the either ends of string. Such as " Hello World ", will be converted into "Hello world".

This works similar to strip, lstrip and rstrip functions, which are frequently used in python.

string strip(string str) {
	while (str[str.length() - 1] == ' ') {
		str = str.substr(0, str.length() - 1);
	}
	while (str[0] == ' ') {
		str = str.substr(1, str.length() - 1);
	}
	return str;
}

string lstrip(string str) {
	while (str[0] == ' ') {
		str = str.substr(1, str.length() - 1);
	}
	return str;
}

string rstrip(string str) {
	while (str[str.length() - 1] == ' ') {
		str = str.substr(0, str.length() - 1);
	}
	return str;
}

Solution 18 - C++

string removespace(string str)
{    
    int m = str.length();
    int i=0;
    while(i<m)
    {
        while(str[i] == 32)
        str.erase(i,1);
        i++;
    }    
}

Solution 19 - C++

I'm afraid it's the best solution that I can think of. But you can use reserve() to pre-allocate the minimum required memory in advance to speed up things a bit. You'll end up with a new string that will probably be shorter but that takes up the same amount of memory, but you'll avoid reallocations.

EDIT: Depending on your situation, this may incur less overhead than jumbling characters around.

You should try different approaches and see what is best for you: you might not have any performance issues at all.

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
QuestionSteve HanovView Question on Stackoverflow
Solution 1 - C++Matt PriceView Answer on Stackoverflow
Solution 2 - C++ArnoView Answer on Stackoverflow
Solution 3 - C++rupelloView Answer on Stackoverflow
Solution 4 - C++Nemanja TrifunovicView Answer on Stackoverflow
Solution 5 - C++user2281802View Answer on Stackoverflow
Solution 6 - C++RomanView Answer on Stackoverflow
Solution 7 - C++ddacotView Answer on Stackoverflow
Solution 8 - C++SudoBashView Answer on Stackoverflow
Solution 9 - C++VolomikeView Answer on Stackoverflow
Solution 10 - C++DeepanshuView Answer on Stackoverflow
Solution 11 - C++NoSenseEtAlView Answer on Stackoverflow
Solution 12 - C++RaGa__MView Answer on Stackoverflow
Solution 13 - C++Crisp ApplesView Answer on Stackoverflow
Solution 14 - C++AnselmRuView Answer on Stackoverflow
Solution 15 - C++Kerim FIRATView Answer on Stackoverflow
Solution 16 - C++EnlicoView Answer on Stackoverflow
Solution 17 - C++D...View Answer on Stackoverflow
Solution 18 - C++test cView Answer on Stackoverflow
Solution 19 - C++Dave Van den EyndeView Answer on Stackoverflow