我有一个长字符串变量,我想在其中搜索特定的单词并根据单词限制文本。
说我有以下文字:
“这款令人惊叹的全新可穿戴式音频解决方案具有嵌入在衬衫前部的工作扬声器,可以播放适合任何情况的音乐或声音效果。就像主演自己的电影一样”< / p>
和单词:“解决方案”,“电影”。
我想从大字符串中减去(比如结果页面中的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异常......我不知道如何检查该位置是否存在而不会导致异常!
请帮忙!
答案 0 :(得分:1)
你可以检查desc.size() - 如果它低于你正在查找的索引+ 1那么你会得到一个异常
答案 1 :(得分:1)
这是利用STL提供的优势。您只需为您的解决方案打开reference和樱桃选择算法和类!
#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;
}
答案 2 :(得分:0)
问题是你开始迭代第一个单词,然后尝试检查它之前的单词,因此OutOfRange Exception。
你的第一个可能是:
if( loc1 != string::npos && loc1 != 0)