如何在c ++字符串中删除所有出现的char

时间:2013-12-02 10:46:52

标签: c++ stl

我正在使用以下内容:

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

但这会导致编译错误。

12 个答案:

答案 0 :(得分:139)

基本上,replace将字符替换为另一个字符,而''不是字符。你要找的是erase

请参阅this question,它可以解答同样的问题。在你的情况下:

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

如果您可以选择boost,请使用#include <boost/algorithm/string.hpp> boost::erase_all(str, "a"); ,例如:

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

所有这些都在reference websites上有详细记录。但如果你不知道这些功能,你可以轻松地手工完成这些事情:

{{1}}

答案 1 :(得分:8)

算法std::replace在给定序列上按每个元素工作(因此它替换了具有不同元素的元素,并且不能用 nothing 替换它)。但是没有字符。如果要从序列中删除元素,则必须移动以下元素,并且std::replace不会像这样工作。

您可以尝试使用std::removetogether with std::erase)来实现此目标。

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

这就是我做到的。

或者你可以像Antoine所说的那样做:

  

参见this question   这回答了同样的问题。在你的情况下:

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

答案 4 :(得分:1)

此代码删除了charecters的重复,即如果输入是aaabbcc,则输出将为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;

答案 5 :(得分:0)

如果您有predicate和/或非空的output来填充过滤后的字符串,我会考虑:

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

在原始问题中,谓词为[](char c){return c != 'a';}

答案 6 :(得分:0)

根据其他答案,这是另一个示例,其中我删除了给定字符串中的所有特殊字符:

#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:ra,..pha
Output:rapha

Input:ovo,
Output:ovo

Input:a.vo
Output:avo

Input:oi?
Output:oi

答案 7 :(得分:0)

比最佳答案快70%的解决方案

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

答案 8 :(得分:0)

我正在读取一个字符串:

"\"internet\""

我想删除引号。我使用了上面建议的 std::erase 解决方案:

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

但是当我对结果进行比较时,它失败了:

if (str == "internet") {}

我实际得到的是:

"internet "

std::erase / std::remove 解决方案在删除结尾时不会缩短字符串。我添加了这个(来自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());

删除尾随空格。

答案 9 :(得分:-1)

我想方法std:remove有效,但是它给了一些兼容性问题,所以我最后编写了这个小函数:

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

只需使用

  

myString = removeCharsFromString(myString,“abc \ r”);

它将删除所有给定的char列表。

当循环在第一次匹配后返回时,这也可能更有效,所以我们实际上做的比较少。

答案 10 :(得分:-1)

我就是这样做的:

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

基本上每当我找到给定的char时,我都会提前偏移并将char重新定位到正确的索引。我不知道这是正确还是有效,我现在(再次)在C ++开始,我很感激任何意见。

答案 11 :(得分:-3)

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

将从str移除大写Y和S,留下“ourtring”。

请注意,remove是一种算法,需要包含标题<algorithm>