如何从字符串C ++中提取和存储单词

时间:2017-11-02 23:34:57

标签: c++

我需要一些从字符串中提取单词的帮助。该字符串将从文件中获取,因此我不知道该单词的位置或它的长度。例如,下面的字符串。如何在不知道单词有多长的情况下将(' how)取出并存储在字符串中?它可能是谷歌或者杜克电影等。

string text = "hi there, 'how are you today?" ; 
string apWord = {" '"} ;
int wstart = text.find(apWord) +1 ;
string word  ;
word = text.substr(wstart, /*???*/ ) ;
cout << word << endl ;

如果我把字符数放在substr / ??? /中就行了,但问题是我不知道怎么弄清楚从空间到空间抓住这个字的字符数。并且进一步使问题复杂化的是,&#39; /&#39; &#39;可能在这个词的中间,例如kit&ty; ty。

string ouch = "Why are kit'ty cats think they're above us?"
int find = text.find(" ' ") ;

我还需要能够抓住&#34; kit&#39; ty&#34;超出这个字符串,不知道这个词在哪里或多久,如果这是有道理的。这适用于以&#39;开头的单词。或包含&#39;某处。我需要能够做到这两点。困难的部分只使用字符串和功能。即,不使用istringstream或vector等。

2 个答案:

答案 0 :(得分:0)

您可以使用正则表达式。对于您的示例,您可以使用:

(\ W *'\ W *)

这会给你两个单词kit'ty,它们是

您可以在此处尝试https://regex101.com/

答案 1 :(得分:0)

我认为此功能适用于以&#39;开头的单词。其次是&#39;在中间。但不确定如何确保它不会以以&#39;

开头的单词执行此操作
void apBegin(string &text)
{
  string apWord = {" '"} ;
  int wstart = text.find(apWord) +1 ;
  int endword = 0 ;
  for (unsigned int i = wstart; i < text.length(); i++)
  {
    if (text[i] == ' ')
    {
      endword = i ;
      break ;
    }
  }
  string word = text.substr(wstart, endword - wstart ) ;
  word.erase(0, 1);
  word += "\' ";
  return ;
}

void apMiddle(string &text)
{
  string text = "once upon a time there were many 'dragons and cats!" ;
  string ap ={"'"} ;
  int location1 = text.find(ap) ;
  int startword = 0, endword = 0 ;
  for (unsigned int i = location1; i < text.length(); i++)
  {
      if (text[i] == ' ')
      {
          endword = i ;
          break ;
      }
  }
    for (unsigned int i = location1; i >0; i--)
  {
      if (text[i] == ' ')
      {
          startword = i + 1;
          break ;
      }
  }
  string otherWord = text.substr(startword, endword - startword) ;
  int found = otherWord.find(ap) ;
  otherWord.erase(found, 1) ;
  otherWord.insert(found + 1, "'") ; // moves ' one to the right.
}