所以我试图创建一个从文本文件中获取输入的程序,并让用户输入他们想要搜索的术语。从那里开始,文件应打印出所有术语前后的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;在它之前和它之后
修复 - 由修复的 难度决定,以及为了使其起作用所需的部件。
答案 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接受的答案包含一个。