从字符串中删除一组字符 如何在C++中删除字符串中的所有指定字符? 例如,如果我有一个字符串“&New&York”,并且我想从集{','&}中删除字符,则删除后的字符串看起来像“NewYork”。 我不希望编写一个函数来迭代字符串并检查字符串中的每个字符(如果它是不需要的集合的一部分)

从字符串中删除一组字符 如何在C++中删除字符串中的所有指定字符? 例如,如果我有一个字符串“&New&York”,并且我想从集{','&}中删除字符,则删除后的字符串看起来像“NewYork”。 我不希望编写一个函数来迭代字符串并检查字符串中的每个字符(如果它是不需要的集合的一部分),c++,string,C++,String,您可以尝试以下方法: str.erase( std::remove_if(str.begin(), str.end(), [](char chr){ return chr == '&' || chr == ' ';}), str.end()); 您可以尝试以下方法: str.erase( std::remove_if(str.begin(), str.end(), [](char chr){ return chr == '&' || chr == ' ';}),

您可以尝试以下方法:

str.erase(
  std::remove_if(str.begin(), str.end(), [](char chr){ return chr == '&' || chr == ' ';}),
  str.end());
您可以尝试以下方法:

str.erase(
  std::remove_if(str.begin(), str.end(), [](char chr){ return chr == '&' || chr == ' ';}),
  str.end());
用这个

#include <string>
#include <algorithm>
#include <cctype>

int main()
{
    std::string s = "the#qu1ck&br0wn ***fox %%jumped 0ver @@the lazy dog";
    s.erase( std::remove_if(s.begin(), s.end(), std::isalnum),
             s.end() );
} 
#包括
#包括
#包括
int main()
{
std::string s=“the#qu1ck&br0wn***fox%%跳过了@那只懒狗”;
s、 擦除(std::remove_if(s.begin()、s.end()、std::isalnum),
s、 end());
} 
使用此

#include <string>
#include <algorithm>
#include <cctype>

int main()
{
    std::string s = "the#qu1ck&br0wn ***fox %%jumped 0ver @@the lazy dog";
    s.erase( std::remove_if(s.begin(), s.end(), std::isalnum),
             s.end() );
} 
#包括
#包括
#包括
int main()
{
std::string s=“the#qu1ck&br0wn***fox%%跳过了@那只懒狗”;
s、 擦除(std::remove_if(s.begin()、s.end()、std::isalnum),
s、 end());
} 

在字符数组上执行此操作的最简单、可能也是最简单的方法(您没有真正指定“字符串”是什么,因此我假设最简单的类型)如下所示:

#include <cstring>

void erase(char *str, char *evilchars)
{
    char *ptr1 = str;
    char *ptr2 = str;

    while(*ptr1)
    {
        *ptr2 = *ptr1;
        if(!strchr(evilchars, *ptr1))
            ++ptr2;
        ++ptr1;
    }

    *ptr2 = 0;
}
#包括
无效擦除(char*str,char*chars)
{
char*ptr1=str;
char*ptr2=str;
而(*ptr1)
{
*ptr2=*ptr1;
如果(!strchr(evillchars,*ptr1))
++ptr2;
++ptr1;
}
*ptr2=0;
}

在字符数组上执行此操作的最简单、可能也是最简单的方法(您没有真正指定“字符串”是什么,因此我假设最简单的类型)如下所示:

#include <cstring>

void erase(char *str, char *evilchars)
{
    char *ptr1 = str;
    char *ptr2 = str;

    while(*ptr1)
    {
        *ptr2 = *ptr1;
        if(!strchr(evilchars, *ptr1))
            ++ptr2;
        ++ptr1;
    }

    *ptr2 = 0;
}
#包括
无效擦除(char*str,char*chars)
{
char*ptr1=str;
char*ptr2=str;
而(*ptr1)
{
*ptr2=*ptr1;
如果(!strchr(evillchars,*ptr1))
++ptr2;
++ptr1;
}
*ptr2=0;
}

任何可能存在的函数的可能副本,只需迭代并逐个检查每个字符即可。没有别的办法了。你为什么要避免它?@AndreasGrapentin我想OP的意思是“我想使用一个现有的函数,而不是编写我自己的。”任何可能存在的函数的可能副本都会重复并逐个检查每个字符。没有别的办法了。你为什么要避免它?@AndreasGrapentin我想OP的意思是“我想使用现有的函数,而不是编写我自己的。”这需要C++11(大多数人还不能使用)。(当然,编写一个小函数对象来做同样的事情是相当简单的。)这需要C++11(大多数人还不能使用)。(当然,编写一个小的函数对象来做同样的事情是相当简单的。)它具有未定义的行为。甚至不一定会编译。而且没有按他的要求做。这有着未定义的行为。甚至不一定会编译。这既不容易(很多代码),也不简单。如果使用
std::string
std::replace_
更简单,也更容易正确。@JamesKanze这很容易理解,即使对于初学者来说,考虑到他们投入了一点时间,这对指针来说无疑是一次宝贵的学习经验。此外,我还没有对它进行基准测试,但我想它的性能可能与std::replace_if相当。我的意思是“简单”,如“在C++中使用最少的外文代码”,字符串的“最简单的可能类型”是“代码> STD::String ,而不是<代码> char */code >。@ AndreasGrapentin在代码< STD::RePosivI:I/code >解决方案中没有外国代码。而且要编写和理解的代码要少得多(而且可能会出错)。如果在循环中每次调用
strchr
都比
std::replace\u(如果建议的版本是
std::replace\u)更快,我会非常惊讶。@JamesKanze应该没有太大区别,因为strchr的参数只是要从字符串中删除的字符数组。但我们不要为此争论。我觉得为了完整起见,这个问题至少应该有一个“低层次”的答案,从一种不同的角度来解决它。这就是我提供指针魔法的原因。然而,我对一个比较我的方法与std::replace_if的小基准非常感兴趣。如果您有时间制作一个,我将非常感激:)这既不容易(很多代码),也不简单。如果使用
std::string
std::replace_
更简单,也更容易正确。@JamesKanze这很容易理解,即使对于初学者来说,考虑到他们投入了一点时间,这对指针来说无疑是一次宝贵的学习经验。此外,我还没有对它进行基准测试,但我想它的性能可能与std::replace_if相当。我的意思是“简单”,如“在C++中使用最少的外文代码”,字符串的“最简单的可能类型”是“代码> STD::String
,而不是<代码> char */code >。@ AndreasGrapentin在代码< STD::RePosivI:I/code >解决方案中没有外国代码。而且要编写和理解的代码要少得多(而且可能会出错)。如果在循环中每次调用
strchr
都比
std::replace\u(如果建议的版本是
std::replace\u)更快,我会非常惊讶。@JamesKanze应该没有太大区别,因为strchr的参数只是要从字符串中删除的字符数组。但我们不要为此争论。我觉得为了完整起见,这个问题至少应该有一个“低层次”的答案,从一种不同的角度来解决它。这就是我提供指针魔法的原因。然而,我对一个比较我的方法与std::replace_if的小基准非常感兴趣。如果您有时间制作,我将非常感谢:)