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 junk”而不是“hello”。我可以对程序进行哪些更改以使其这样做?

4

1 回答 1

1

如果你打算使用strtok,你至少应该使用它的可重入版本strtok_r。然后,您应该将代码更改为在空格处拆分,而不是在井号处拆分。这会给你令牌。最后,在循环中,您需要查找第一个字符作为哈希标记,如果存在则将项目添加到列表中,并在哈希标记不存在时忽略该项目。

更好的方法是使用字符串流:将字符串放入其中,逐个读取标记,然后丢弃没有哈希标记的标记。

以下是使用 C++11 的 lambda 只需很少的代码即可完成的方法:

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 回答