找到c ++时替换字符串向量中的特定字符

时间:2012-03-07 15:29:10

标签: c++ vector replace find

我在查找和替换功能方面遇到了一些麻烦我可以让它替换所有字符,但我只想让它更改与禁止的字符匹配的字符。

到目前为止,这是我的代码

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] = "***";
        }
    }
}

这只是替换了固定数量的 * ,但我希望它用*而不是整个单词替换它找到的字符。

提前致谢

3 个答案:

答案 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 );