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 に答える