使用迭代器从字符串中删除特殊字符

3
我今天为您提供一个相对简单的问题,但它确实让我困惑了数小时。我猜测我的字符串迭代器的字幕可能有问题。我已经在网上查找过,并将代码提交给了我的CSE教授 - 但由于感恩节假期,他只有手机,无法提供太多帮助。
希望有人能看一下这个问题并立即发现问题所在。需要注意的是,我的目标仅是从字符串中删除特殊字符。该字符串通过引用传递到函数中(因此不需要返回类型)。另外,我正在尽可能地保持效率。我的最初想法是将其转换为嵌套的for循环,但我的CSE教授坚持认为,在某些特殊情况下,带有字符串迭代器的for循环更加有效,因此我应该坚持使用它。如果有人可以帮忙,请告诉我!!
在我看来,问题似乎必须存在于remove函数中,因为remove需要一个const char *,而不仅仅是char *。我假设text.begin()不是const,因此引起了问题。但是,如果我将函数的参数设置为const string &text,则我们显然无法通过引用修改text。
以下是我目前拥有的代码:
在主函数中:
 string temp = "~cool~";
 XML * parser = new XML();
 parser->clearSpecialChars(temp);
 cout << temp;

并且这个函数的作用是:

void XML::clearSpecialChars(string &text)
{
    char chars[]= ".,!()1234567890[]'<>:/{}_|=+;-`~";
        for (unsigned int i = 0; i < 33; ++i)
        {
            text.erase(std::remove(text.begin(),text.end(),chars[i]),text.end());
        }
 }

然而,我遇到了一个编译错误:
 XML.cpp: In member function ‘void XML::clearSpecialChars(std::string&)’:
 XML.cpp:86:69: error: cannot convert ‘std::basic_string<char>::iterator {aka __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >}’
 to ‘const char*’ for argument ‘1’ to ‘int remove(const char*)’

任何想法都将不胜感激!

2
你是否已经包含了“algorithm”头文件?还有另一个名为“remove”的函数,它接受“const char*”作为参数。 - hinafu
2个回答

3

1
这就可以了 - 我只包含了STL。当你意识到自己错过了一些如此愚蠢的东西时,感觉很糟糕。非常感谢您的关注! - MS-DDOS

1
“33”这个硬编码让我感到不舒服。你真的想要在特殊字符集中包含‘\x00’吗?
如果可能的话,现代C++会将循环转移到库例程中。这是一个不同的实现方式。
void XML::clearSpecialChars(string &text)
{
    const string chars = ".,!()1234567890[]'<>:/{}_|=+;-`~\x00";

    auto new_end = std::remove_if(text.begin(), text.end(), 
        [chars](string::value_type c)
            { return chars.find(c) != string::npos; });
    text.erase(new_end, text.end());
}

我们之前有一个strlen,因为特殊字符不会改变,所以我们决定可以通过不包括<cstdio>并硬编码33来节省空间。看起来迭代器正在变得越来越流行,你能推荐一些好的阅读材料帮助我跟上步伐吗? - MS-DDOS
"Generic Programming and the STL" 一书是我所知道的最好的资源,由 Matthew Austern 所著。 - user515430

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接