2013-10-28 36 views
0

我有以下形式的字符串在C++删除字符

string variable1="This is stackoverflow \"Here we go "1234" \u1234 ABC"; 

现在,在这个字符串我要删除所有字符,除了字母(从A到B和A到B)和数字。所以我的输出变成

variable1="This is stackoverflow Here we go 1234 u1234 ABC"; 

我试图检查使用指针的每个字符,但发现它非常低效。有没有一种使用C++/C实现相同的有效方法?

+0

它是如何低效也许一些代码?请记住,当从中间的字符串中删除一个字符时,意味着所有连续字符都必须移回一个字符,您必须使用临时字符串来确保不会发生这种情况。 – Xonar

+0

这是C++,请删除C标签。 – clcto

+0

从主题和标签中删除'C'。 'C'没有'string'类型,当你说'C++/C'字符串时,人们假设你的意思是nul结尾的字符数组。 – kfsone

回答

7

使用std::remove_if

#include <algorithm> 
#include <cctype> 

variable1.erase(
    std::remove_if(
     variable1.begin(), 
     variable1.end(), 
     [] (char c) { return !std::isalnum(c) && !std::isspace(c); } 
    ), 
    variable1.end() 
); 

注意的std::isalnumstd::isspace行为取决于当前的语言环境。

+2

删除单个字符。 – jrok

+0

['std :: ispunct'](http://en.cppreference.com/w/cpp/locale/ispunct)怎么样? – 0x499602D2

+0

我不知道为什么,但它给了我错误:没有匹配的函数调用'remove_if(std :: basic_string :: iterator,std :: –

2

工作的代码示例: http://ideone.com/5jxPR5

bool predicate(char ch) 
    { 
    return !std::isalnum(ch); 
    } 

int main() { 
    // your code goes here 


    std::string str = "This is stackoverflow Here we go1234 1234 ABC"; 

    str.erase(std::remove_if(str.begin(), str.end(), predicate), str.end()); 
    cout<<str; 
    return 0; 
}