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

Remove special characters from a string using iterators

本文关键字:删除 特殊字符 字符串 迭代器      更新时间:2023-10-16

我今天有一个非常简单的给你,但它肯定让我困扰了好几个小时。我想我的字符串迭代器的字幕有问题。我在网上查过,甚至把代码传给了我的CSE教授——但由于是感恩节假期,他只有手机,没能帮上什么忙。

希望有人能看到这一点并立即发现问题。注意,我的目标只是从字符串中删除特殊字符。此字符串通过引用传递到函数中(因此不需要返回类型)。作为补充说明,我正在努力保持这一点尽可能有效。我最初的想法是简单地将其转换为嵌套的for循环,但我的CSE教授坚持认为,在某些特殊情况下,内置字符串迭代器的for循环更有效,所以我应该坚持这一点。如果有人能帮忙,请告诉我!!

在我看来,问题一定出在remove函数上,因为remove需要一个const char*,而不仅仅是一个char*。我认为text.begin()不是常量,因此导致了这个问题。但是如果我把函数的参数设为常量字符串&文本,我们显然不能通过引用来修改文本。

这是我迄今为止的代码:

我们主要有:

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*)’

任何想法都将不胜感激!

有两个函数称为remove。以下是对它们的描述:

http://www.cplusplus.com/reference/algorithm/remove/

http://www.cplusplus.com/reference/clibrary/cstdio/remove/

硬编码的"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());
}