在C ++中查找字符串中单词的所有实例

时间:2015-03-07 18:33:04

标签: c++ string

所以我试图创建一个从文本文件中获取输入的程序,并让用户输入他们想要搜索的术语。从那里开始,文件应打印出所有术语前后的3个星号。

它目前有效,但它只找到文件中的第一个术语,我希望它能找到所有术语。有什么帮助吗?

由于

#include <iostream>
#include <fstream>
#include <string>
#include <cassert>
#include <cstdio>

using namespace std;

int main(void)
{
    int a, i, z, loc;
    string inputFileName;
    string s, term;
    ifstream fileIn;
    char ch;
    cout << "Enter the name of a file of characters: ";
    cin >> inputFileName;
    fileIn.open(inputFileName.data());
    assert(fileIn.is_open() );
    i = 0;

    while (!(fileIn.eof()))
    {
        ch = fileIn.get();
        s.insert(i, 1, ch);     //insert character at position i
        i++;
    }

    cout << s;
    cout << "Enter a word/phrase you want to search for in the file you entered" << endl;
    cin >> term;
    cout << "The word/phrase " << term << " will have '***' before it and after it" << endl;
    z = (int)term.length();
    loc = s.find(term);

    s.insert(loc, 1, '*');
    s.insert(loc+1, 1, '*');
    s.insert(loc+2, 1, '*');

    s.insert(loc+3+z, 1, '*');
    s.insert(loc+4+z, 1, '*');
    s.insert(loc+5+z, 1, '*');
    cout << s;

    return 0;
}

文字输出
输入字符文件的名称:text.txt

修复 - 由修复难度和部件所需的部件决定。

在您输入的文件中输入您要搜索的字词/词组

单词/短语将具有&#39; ***&#39;在它之前和它之后

修复 - 由修复的 难度决定,以及为了使其起作用所需的部件。

2 个答案:

答案 0 :(得分:0)

string.find(“term”)仅为您提供术语“term”的第一次出现。 如果您的文件不是太长,解决问题的一种方法如下。

int loc[100], i=0;
int pos = string.find("term", 0);
while(pos!=string::npos) {
   loc[i] = pos;
   pos = string.find("term", pos+1);
   i++;
} 

string.find(term,pos)允许您在索引“pos”之后或之后搜索字符串中的术语。

当然,您可以创建一个动态数组来存储100多个位置

答案 1 :(得分:0)

  

的std :: basic_string的::找到

     

返回值
  如果找不到这样的子字符串,则找到子字符串或npos的第一个字符的位置。

http://en.cppreference.com/w/cpp/string/basic_string/find

这意味着您可以简单地循环std::string::find,直到其返回值为npos,将前一个子字符串位置加上子字符串长度作为起始位置。

由于您也不想找到包含子字符串的单词,而只是将子字符串作为独立单词,我在函数的开头添加了一些检查。 注意:此时使用正则表达式引擎可能更干净。

loc = 0;

while ((loc = s.find(term, loc)) != std::string::npos)
{
    // check for space at start of term, or check
    // for beginning of string
    if (loc != 0 && s[loc - 1] != ' ') {
        loc += z;
        continue;
    }

    // check for space at end of term, or check for end of string
    if (loc != (s.length() - z) && s[loc + z] != ' ') {
        loc += z;
        continue;
    }

    s.insert(loc, 1, '*');
    s.insert(loc+1, 1, '*');
    s.insert(loc+2, 1, '*');

    s.insert(loc+3+z, 1, '*');
    s.insert(loc+4+z, 1, '*');
    s.insert(loc+5+z, 1, '*');

    loc += z;
    loc += 6; // the amount of asterisks added
}

还有更快的方法来查找所有子字符串,而不是使用C ++标准库。 This question's接受的答案包含一个。