0
vector<string> CategoryWithoutHashTags;
string tester = "#hello junk #world something #cool";
char *pch;
char *str;
str = new char [tester.size()+1];
strcpy(str, tester.c_str());

pch = strtok(str,"#");
while(pch!=NULL)
{
    CategoryWithoutHashTags.push_back(pch);
    pch=strtok(NULL,"#");
}
cout<<CategoryWithoutHashTags[0]<<endl;

すべてのハッシュ タグの単語を文字列のベクトルに格納するプログラムを作成したいと考えています。上記のプログラムは、最初のインデックスに "hello" ではなく "hello Junk" を格納します。そのためには、プログラムにどのような変更を加えることができますか?

4

1 に答える 1

1

を使用することに設定されている場合はstrtok、少なくともその再入可能バージョンを使用する必要がありますstrtok_r。次に、ハッシュ マークではなくスペースで分割するようにコードを変更する必要があります。これにより、トークンが得られます。最後に、ループ内で最初の文字がハッシュ マークであるのを探し、そこにある場合はその項目をリストに追加し、ハッシュ マークがない場合は項目を無視する必要があります。

さらに優れたアプローチは、文字列ストリームを使用することです。文字列をストリームに入れ、トークンを 1 つずつ読み取り、ハッシュ マークのないトークンを破棄します。

C++11 のラムダを使用して、ごくわずかなコードでそれを行う方法を次に示します。

stringstream iss("#hello junk #world something #cool");
istream_iterator<string> eos;
istream_iterator<string> iit(iss);
vector<string> res;
back_insert_iterator< vector<string> > back_ins(res);
copy_if(iit, eos, back_ins, [](const string s) { return s[0] == '#'; } );

ideone のデモ。

于 2013-10-18T17:10:20.227 に答える