我在查找和替换功能方面遇到了一些麻烦我可以让它替换所有字符,但我只想让它更改与禁止的字符匹配的字符。
到目前为止,这是我的代码
class getTextData
{
private:
string currentWord;
vector<string> bannedWords;
vector<string> textWords;
int bannedWordCount;
int numWords;
char ch;
int index[3];
ifstream inFile ();
public:
void GetBannedList(string fileName);
void GetWordAmount(string fileName);
void GetDocumentWords(string fileName);
void FindBannedWords();
void ReplaceWords(string fileOutput);
};
for(int i = 0; i <= numWords; i++)
{
for(int j = 0; j < bannedWordCount; j++)
{
if(string::npos != textWords[i].find(bannedWords[j]))
{
textWords[i] = "***";
}
}
}
这只是替换了固定数量的 * ,但我希望它用*而不是整个单词替换它找到的字符。
提前致谢
答案 0 :(得分:2)
您可以使用std::string::replace()
将特定数量的字符更改为多个相同字符的实例:
size_t idx = textWords[i].find(bannedWords[j]);
if(string::npos != idx)
{
textWords[i].replace(idx,
bannedWords[j].length(),
bannedWords[j].length(),
'*');
}
注意,外部for
循环的终止条件看起来很可疑:
for(int i = 0; i <= numWords; i++)
如果numWords
中确实存在textWords
,则会访问vector
之后的for (int i = 0; i < textWords.size(); i++)
{
for (int j = 0; j < bannedWords.size(); j++)
{
}
}
。考虑使用迭代器或从容器本身获取要索引的容器中的元素数量:
{{1}}
而不是复制其他变量中的大小信息。
答案 1 :(得分:1)
试试这个:
for(int i = 0; i <= numWords; i++)
{
for(int j = 0; j < bannedWordCount; j++)
{
size_t pos = textWords[i].find(bannedWords[j]
if(string::npos != pos))
{
textWords[i].replace(pos, bannedWords[j].length(),
bannedWords[j].length(), '*');
}
}
}
答案 2 :(得分:0)
使用string :: replace(),为每个被禁词调用它,并用固定字符串“*”替换文本。 语法:
string& replace ( size_t pos1, size_t n1, const char* s );
string& replace ( iterator i1, iterator i2, const char* s );