Заменить определенные символы в строковом векторе при обнаружении c ++ - PullRequest
0 голосов
/ 07 марта 2012

У меня возникли небольшие проблемы с функцией поиска и замены. Я могу заставить ее заменить все символы, но я только хочу, чтобы она меняла символы, соответствующие запрещенным словам.

Вот мой кодпока что

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 ]

2 голосов
/ 07 марта 2012

Вы можете использовать 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++)

, если в textWords есть ровно numWords, это будет доступ к одному за пределами vector. Подумайте об использовании итераторов или получите количество элементов в индексируемом контейнере из самого контейнера:

for (int i = 0; i < textWords.size(); i++)
{
    for (int j = 0; j < bannedWords.size(); j++)
    {
    }
}

вместо дублирования информации о размере в других переменных.

1 голос
/ 07 марта 2012

Попробуйте это:

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(), '*');
        }
    }
}
0 голосов
/ 07 марта 2012

Используйте string :: replace (), вызывайте его для каждого запрещенного слова и заменяйте текст фиксированной строкой "*". Синтаксис:

string& replace ( size_t pos1, size_t n1,   const char* s );
string& replace ( iterator i1, iterator i2, const char* s );
...