我正在创建一个从字符串中删除元素的函数。但是,我似乎无法让我的两个循环一起工作。第一个while循环完美无缺。我调查了它,我相信它可能是因为当找不到“find_last_of”时,它仍会返回一个值(这会抛弃我的循环)。我无法弄清楚如何解决它。谢谢。
#include <iostream>
#include <string>
using namespace std;
string foo(string word) {
string compare = "!@#$";
string alphabet = "abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
while(word.find_first_of(compare) < word.find_first_of(alphabet)) {
int position = word.find_first_of(compare);
word = word.substr(++position);
}
while(word.find_last_of(compare) > word.find_last_of(alphabet)){
int size = word.length();
word = word.substr(0, --size);
}
return word;
}
int main() {
cout << foo("!!hi!!");
return 0;
}
我是这样写的,所以复合词不会受到影响。期望的结果:“嗨”
答案 0 :(得分:1)
目前还不完全清楚你要做什么,但如何用这个替换第二个循环:
string::size_type p = word.find_last_not_of(compare);
if(p != string::npos)
word = word.substr(0, ++p);
答案 1 :(得分:0)
目前尚不清楚您是否只想修剪word
正面和背面的某些字符,或者您想要从word
移除某一组字符中的每一个字符,无论它们位于何处。根据您问题的第一句话,我假设您要执行后者:从compare
删除word
中的所有字符。
更好的策略是更直接地检查每个角色以查看是否需要删除它,如果是,则执行此操作,一次性通过word
。由于compare
很短,所以这样的事情可能已经足够了:
// Rewrite word by removing all characters in compare (and then erasing the
// leftover space, if any, at the end). See std::remove_if() docs.
word.erase(std::remove_if(word.begin(),
word.end(),
// Returns true if a character is to be removed.
[&](const char ch) {
return compare.find(ch) != compare.npos;
}),
word.end());
BTW,我不确定为什么你的例子中有compare
和alphabet
字符串。看起来你只需要定义一个或另一个,而不是两者。一个字符要么保留要么要删除一个字符。