我正在打印重复项,并且想要删除用于读取的代码,直到句子的文件末尾并删除多余的空格。
我用这段代码将每个句子分成单词。
vector <string> oneWordPhrase;
vector <string> twoWordPhrase;
vector<string>::iterator it1;
vector<string>::iterator it2;
string split = str;
string word;
stringstream stream(split);
while( getline(stream, word, ' ') )
{
cout<<word<<endl;
oneWordPhrase.push_back(word);
}//split the sentence into words
for(it1=oneWordPhrase.begin(); it1!=oneWordPhrase.end(); it1++) /* the problem
{ is here. */
if(it1+1 == oneWordPhrase.end())
break; //signal break if we are near the end of a sentence
twoWordPhrase.push_back(*it1 + ' ' + *(it1+1));
}
for(int i=0; i<twoWordPhrase.size(); i++)
cout<<twoWordPhrase[i]<<endl
此代码适用于一个句子。例如,如果我的字符串是“你好我的名字是鲍勃。我是学生。”我想打印
“你好我的”
“我的名字”
“名字是”
“是bob”
/ *新句子* /
“我是”
“我是”
“学生”
但是我的输出是
“你好我的”
“我的名字”
“名字是”
“是bob”
/ *问题在这里。它会回到句子的开头* /
“你好我的”
“我的名字”
“名字是”
“是bob”
“bob i”
/ *它也不识别新句子* /
“我是”
“我是”
“学生”
我有没有办法让我的迭代器指向它离开的地方而不是开头。此代码适用于一个句子,但它创建的副本超过1个字符串
答案 0 :(得分:0)
你没有正确地检测句子的结尾。
if(it1+1 == oneWordPhrase.end())
break; //signal break if we are near the end of a sentence
只有当您到达整个短语的末尾时才会触发上面的行。不只是一句话。要检测句子,您需要检测句点。这是一种可能的方法:
for (it1 = oneWordPhrase.begin(); it1 + 1 != oneWordPhrase.end(); it1++) {
if (it1[0][(it1[0].size() - 1)] == '.') {
continue;
}
twoWordPhrase.push_back(*it1 + ' ' + *(it1 + 1));
}
我将it1 != oneWordPhrase.end()
更改为it1 + 1 != oneWordPhrase.end()
以模拟break语句的行为。
it1[0][(it1[0].size() - 1)]
提取您存储的单词的最后一个字符。