从文件中读取句子并将它们分成两个单词短语。

时间:2014-03-04 03:43:02

标签: c++ regex string vector iterator

我正在打印重复项,并且想要删除用于读取的代码,直到句子的文件末尾并删除多余的空格。

我用这段代码将每个句子分成单词。

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个字符串

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)]

提取您存储的单词的最后一个字符。