相关文章推荐
留胡子的扁豆  ·  sql ...·  3 天前    · 
要出家的小熊猫  ·  Java ...·  昨天    · 
含蓄的弓箭  ·  vue iview ...·  1 年前    · 
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

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;
                Because 'isspace' has overloads, you will probably need to qualify the generic code to use ::isspace (the C implementation that doesn't take a locale) or be greeted with cryptic template instantiation errors.
– Bklyn
                Jan 5, 2009 at 15:10
                All - be wary of the above method (The two single lines, not the templated version, although it may have the same issue).  I used it in a project without realizing that it isn't always correct.  For example, if you pass it the string "1 + 1" it returns "1+11".    I switched to @rupello 's method below and it worked fine for this case.  Happy coding!
– JoeB
                Apr 19, 2012 at 18:43
                @Joe The answer explicitly mentions that you need to call erase afterwards. That will return the correct result.
– Konrad Rudolph
                Sep 15, 2012 at 7:17
                -1 this use of isspace is UB for all character sets except original 7-bit ASCII. C99 §7.4/1. it does not surprise me that it's been upvoted to the tune of 71 votes by now, in spite of being Very Bad Advice.
– Cheers and hth. - Alf
                Oct 25, 2012 at 13:48
                Just to repeat, the code in this answer passes negative values (different from EOF) to isspace, for all non-ASCII characters, with the in-practice default choice of signedness for char. Thus it has undefined behavior. I'm repeating it because I suspect a deliberate attempt to drown that fact in noise.
– Cheers and hth. - Alf
                Sep 10, 2014 at 22:07
                My up-vote for the canonical erase/remove idiom.  Can be made into a one liner:  str.erase (std::remove (str.begin(), str.end(), ' '), str.end());
– Bklyn
                Jan 5, 2009 at 15:08
                This will not compile on standards-conforming implementations because of the locale-taking overloads of std::isspace.  You'll need to use ::isspace or perform some unreadable machinations with std::bind2nd.  Isn't generic code beautiful?
– Bklyn
                Jan 5, 2009 at 15:23
                Also note that if any of the characters is negative (eg a UTF8 char when char is signed), use of ::isspace is UB.
– Martin Bonner supports Monica
                Dec 2, 2019 at 8:38
                C++17 solution: string.erase(std::remove_if(string.begin(), string.end(), [](unsigned char x) { return std::isspace(x); }), string.end());
– Michal Steller
                Apr 12, 2021 at 16:44

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, " "); 
                It is slower than the remove_if(str.begin(), str.end(), isspace); that Matt Price mentioned. I don't know why. Actually, all the boost stuff, that have STL alternatives, are slower than the corresponding gcc ones (All the ones I tested). Some of them are immensely slower! (up to 5 times in unordered_map inserts) Maybe it is because of the CPU cache of the shared environment or something like it.
– Etherealone
                Aug 14, 2012 at 20:23

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;

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>
                Equally short for the call-site is calling a function taking a lvalue-reference to a string.  Macros can have surprising behaviors interacting with their arguments (esp with side effects), but worse, if they're involved in an error, their names do not show up in compiler messages, their implementation does.
– Chris Uzdavinis
                Apr 29, 2019 at 4:23
                Yes - macros can make debugging and maintenance very difficult. In a small program, maybe they're OK. In a multi-million line application with hundreds of projects, macros can really be a pain.
– GTAE86
                Oct 1, 2020 at 16:21
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, " ", "+");

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"),"");
                Why would you recommend this approach over @Matt-Price‘s accepted answer from over a decade ago?
– Jeremy Caney
                Jun 5, 2020 at 4:27
                I’m not arguing against that. I’m saying make it easier for people to assess different approaches by explaining the differences and what scenarios they might be better suited for.
– Jeremy Caney
                Jun 5, 2020 at 5:20
                Probably this solution is not the most economical, but it allows you to get rid of all whitespace characters  '\s', not just spaces ' '.
– AnselmRu
                Jun 5, 2020 at 5:34
                This doesn't really add anything more than this answer already does. Is there more explanation or detail you could add to make your answer higher quality and worth keeping on this question?
– Das_Geek
                Nov 26, 2019 at 14:45
                Great! Then put that reasoning as an explanation directly in your answer. The original question is more than eleven years old, and without a justification your answer could get seen as noise when compared to the other accepted, well-upvoted answers. Having that explanation will help keep your answer from being removed.
– Das_Geek
                Nov 26, 2019 at 15:31
                That would be good but I couldn't get that how should I put that into my answer... that my answer is better than this answer.? It would be a great pleasure if you could edit my answer.
– Deepanshu
                Nov 26, 2019 at 15:40
                Unfortunately, editing your answer to add that content myself would go against the editing guidelines, and my edit would likely get declined or rolled back later. You can use the first link in this comment to edit the answer yourself. It's totally acceptable to state that you think your answer is better than some other one, and provide justification for it. The community will decide whether you're right by upvoting or downvoting.
– Das_Geek
                Nov 26, 2019 at 15:44

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.

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");
  string str = "2C F4 32 3C B9 DE";
  str.erase(remove(str.begin(),str.end(),' '),str.end());
  cout << str << endl;

output: 2CF4323CB9DE

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;
                @test - length() returns a size_t, not an int. erase() takes a size_type, not an int. The function will probably fail if two consecutive spaces are encountered since the index is always incremented. If one space is removed, then the loop will read beyond the string's bounds. You should probably delete this answer since it needs a lot of help.
– jww
                May 4, 2015 at 19:52

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.

remove_if makes at most one copy of each value. So there really isn't that much overhead relative to what needs to be done. – Matt Price Sep 17, 2008 at 14:04