C++ 如何检查std字符串中是否存在位置??(c+;+;)

C++ 如何检查std字符串中是否存在位置??(c+;+;),c++,string,std,C++,String,Std,我有一个长字符串变量,我想在其中搜索特定的单词,并根据这些单词限制文本 假设我有以下文本: “这一令人惊叹的全新可穿戴音频解决方案的特点是衬衫正面嵌入了一个可工作的扬声器,可以播放适合任何情况的音乐或音效。就像在自己的电影中主演一样” 还有“解决方案”,“电影” 我想从大字符串中减去(如结果页面中的谷歌): “…新的可穿戴音频解决方案具有内置工作扬声器…” 和 “…就像在自己的电影中主演一样” 为此,我使用以下代码: for (std::vector<string>::iterato

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

假设我有以下文本:

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

还有“解决方案”,“电影”

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

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

为此,我使用以下代码:

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+="...";    
        }    
      }
for(std::vector::iterator it=words.begin();it!=words.end();+it)
{
int loc1=(int)desc.find(*it,0);
if(loc1!=字符串::npos)
{

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

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

您的第一个if可能是:

if( loc1 != string::npos && loc1 != 0)

这是一个很好的利用STL所能提供的功能的练习。你只需打开一个和cherry pick算法和类就可以得到你的解决方案

#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;
}
#包括//algorithm、string、list、cctype、functional、boost/assign.hpp
使用名称空间std;
结构从中删除{
从(字符串和文本)中删除_:text(文本){}
void运算符()(常量字符串和str){
typedef字符串::迭代器striter;
striter e(搜索(text.begin(),text.end(),str.begin(),str.end());
而(e!=text.end()){
斯特里特b=e;
前进(e,str.length());
e=find_if(e,text.end(),not1(ptr_fun(isspace)));
删除(b,e);
e=搜索(text.begin(),text.end(),str.begin(),str.end());
}
}
私人:
字符串和文本;
};
int main(int argc,char*argv[])
{
list toremove=boost::assign::list_of(“解决方案”)(“电影”);
字符串文本(“这是一款令人惊异的新型可穿戴…”);
对于每个_(toremove.begin()、toremove.end()、从(文本)中删除_);

缩进的疯狂程度到底是怎么回事?请让你的代码更容易阅读,这样人们就不必那么努力地帮助你了。你的意思是你想从文本中删除任何给定的字符串吗?哦,对不起,我花了些时间对它进行格式化,但显然它不清楚……我正在处理它,对不起;)他想删除与给定字符串的任何匹配项相距超过N个单词的所有文本部分。@yox:我指的是代码中的缩进,就像Marcelo评论的那样。我将删除我的注释,因为它有点多余。