1

我有一个长字符串变量,我想在其中搜索特定单词并根据这些单词限制文本。

假设我有以下文字:

这个令人惊叹的新型可穿戴音频解决方案的特点是在衬衫前部嵌入了一个工作扬声器,可以播放适合任何情况的音乐或音效。就像在自己的电影中主演一样

和单词:“解决方案”,“电影”。

我想从大字符串中减去(如结果页面中的 google):

“......新的可穿戴音频解决方案具有嵌入的工作扬声器......”和“......就像在自己的电影中主演一样”

为此,我正在使用代码:

for (std::vector<string>::iterator it = words.begin(); it != words.end(); ++it)
{
    int loc1 = (int)desc.find( *it, 0 );    
    if( loc1 != string::npos )
    {
        while(desc.at(loc1-i) && i<=80)
        {       
            i++;
            from=loc1-i;
            if(i==80) fromdots=true;
        }
        i=0;
        while(desc.at(loc1+(int)(*it).size()+i) && i<=80)
        {
            i++;
            to=loc1+(int)(*it).size()+i;
            if(i==80) todots=true;
        }

        for(int i=from;i<=to;i++)
        {    
            if(fromdots) mini+="...";
            mini+=desc.at(i);
            if(todots) mini+="...";    
        }    
      }

但是 desc.at(loc1-i) 导致 OutOfRange 异常...我不知道如何检查该位置是否存在而不会导致异常!

请帮忙!

4

3 回答 3

1

您可以检查 desc.size() - 如果它小于您正在查找的索引 + 1,那么您将得到一个异常

于 2010-04-12T04:24:54.367 回答
1

这是利用 STL 所提供的功能的绝佳练习。您只需为您的解决方案打开一个参考并挑选算法和类!

#include <iostream> // algorithm,string,list,cctype,functional,boost/assign.hpp
using namespace std;

struct remove_from {
    remove_from(string& text) : text(text) { }
    void operator()(const string& str) {
        typedef string::iterator striter;
        striter e(search(text.begin(), text.end(), str.begin(), str.end()));
        while( e != text.end() ) {
            striter b = e;
            advance(e, str.length());
            e = find_if(e, text.end(), not1(ptr_fun<int,int>(isspace)));
            text.erase(b, e);
            e = search(text.begin(), text.end(), str.begin(), str.end());
        }
    }
private:
    string& text;
};

int main(int argc, char* argv[])
{
    list<string> toremove = boost::assign::list_of("solution")("movie");
    string text("This amazing new wearable ...");
    for_each(toremove.begin(), toremove.end(), remove_from(text));
    cout << text << endl;
    return 0;
}
于 2010-04-12T04:55:54.207 回答
0

问题是您从第一个单词开始迭代,然后尝试检查它之前的单词,因此出现 OutOfRange 异常。

你的第一个如果可能是:

if( loc1 != string::npos && loc1 != 0)
于 2010-04-12T04:25:09.197 回答