it-swarm-vi.tech

Xóa khoảng trắng khỏi std :: string trong C ++

Cách ưa thích để loại bỏ khoảng trắng khỏi chuỗi trong C++ là gì? Tôi có thể lặp qua tất cả các ký tự và xây dựng một chuỗi mới, nhưng có cách nào tốt hơn không?

197
Steve Hanov

Điều tốt nhất để làm là sử dụng thuật toán remove_if và isspace:

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

Bây giờ, thuật toán tự nó không thể thay đổi vùng chứa (chỉ sửa đổi các giá trị), vì vậy nó thực sự xáo trộn các giá trị xung quanh và trả về một con trỏ đến nơi kết thúc bây giờ. Vì vậy, chúng ta phải gọi chuỗi :: erase để thực sự sửa đổi độ dài của container:

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

Chúng ta cũng nên lưu ý rằng remove_if sẽ tạo tối đa một bản sao của dữ liệu. Đây là một triển khai mẫu:

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;
}
231
Matt Price
std::string::iterator end_pos = std::remove(str.begin(), str.end(), ' ');
str.erase(end_pos, str.end());
84
Arno

Từ gamedev

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

Bạn có thể sử dụng Boost String Algo? http://www.boost.org/doc/libs/1_35_0/doc/html/opes_algo/usage.html#id129057

erase_all(str, " "); 
30
Nemanja Trifunovic

Để cắt xén, hãy sử dụng tăng thuật toán chuỗi :

#include <boost/algorithm/string.hpp>

using namespace std;
using namespace boost;

// ...

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

Bạn có thể sử dụng giải pháp này để xóa char:

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

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

Xin chào, bạn có thể làm một cái gì đó như thế. Hàm này xóa tất cả các khoảng trắng.

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

Tôi đã thực hiện một chức năng khác, đó là xóa tất cả các không gian không cần thiết.

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;
}
10
ddacot
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);
}

sử dụng nó:

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

Nếu bạn muốn làm điều này với một macro dễ dàng, đây là một:

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

Điều này giả định rằng bạn đã thực hiện #include <string> tất nhiên.

Gọi nó như vậy:

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

Tôi đã sử dụng các công việc dưới đây trong thời gian dài - không chắc về sự phức tạp của nó.

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

khi bạn muốn xóa ký tự ' ' và một số ví dụ - sử dụng

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

tương tự, chỉ cần tăng || nếu số ký tự bạn muốn xóa không phải là 1

nhưng như đã đề cập bởi những người khác, xóa thành ngữ cũng có vẻ tốt.

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

    return newWord;
}

Mã này về cơ bản lấy một chuỗi và lặp qua mọi ký tự trong nó. Sau đó, nó kiểm tra xem chuỗi đó có phải là khoảng trắng hay không, nếu không thì ký tự đó sẽ được thêm vào chuỗi mới.

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