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

我使用以下方法:

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

但是这给出了编译错误。

302010 次浏览

基本上,replace用另一个字符替换一个字符,而 ''不是一个字符。

参见 这个问题,它回答了同样的问题。在你的例子中:

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

算法 std::replace在给定的序列上运行 每个元素(因此它用不同的元素替换元素,而不能用 没什么替换元素)。但是没有 空荡荡的字符。如果要从序列中删除元素,以下元素必须是 感动,而 std::replace不是这样工作的。

您可以尝试将 std::remove()str.erase()1一起使用来实现这一点。

str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
#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>

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

这段代码消除了字符的重复,也就是说,如果输入是 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;

我猜 std: move 方法可以工作,但是它给 include 带来了一些兼容性问题,所以我最终编写了这个小函数:

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

它将删除给定字符列表的所有匹配项。

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

我是这么做的:

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

基本上,每当我找到一个给定的字符,我提前偏移量和重新定位字符到正确的索引。我不知道这是否正确或有效,我正在(再次)从 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;
}

我就是这么做的。

或者你可以像安托万说的那样:

参见 < a href = “ https://stackoverflow. com/questions/5891610/how-to-remove-words-from-a-string”> this 有个问题 这也回答了同样的问题。就你的情况而言:

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

如果您有一个 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';}

基于其他答案,这里再举一个例子,我删除了给定字符串中的所有特殊字符:

#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

比最高答案快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;
});
}

我有一个正在读取的字符串:

"\"internet\""

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

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

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

if (str == "internet") {}

实际上我得到的是:

"internet "

std::erase/std::remove解决方案在删除字符串末尾时不会缩短字符串:

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

删除尾随空间。

从 C + + 20开始,std::erase()被添加到标准库中,它将对 str.erase()std::remove()的调用合并为一个函数:

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

作用于字符串的 std::erase()函数重载直接在 <string>头文件中定义,因此不需要单独的 include。为所有其他容器定义了类似的重载。