正确循环时无法获得第二个

时间:2014-02-16 20:20:26

标签: c++

我正在创建一个从字符串中删除元素的函数。但是,我似乎无法让我的两个循环一起工作。第一个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;
}

我是这样写的,所以复合词不会受到影响。期望的结果:“嗨”

2 个答案:

答案 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,我不确定为什么你的例子中有comparealphabet字符串。看起来你只需要定义一个或另一个,而不是两者。一个字符要么保留要么要删除一个字符。