поиск нескольких совпадений строки

#c

#c

Вопрос:

Как я могу найти несколько вхождений строки внутри строки? И заменять найденную строку другой строкой во всех вхождениях? Допустим, у меня есть строка ниже:

 "A cat is going. It is black-white stripped."
  

Я хочу заменить все вхождения «is» на are.

Комментарии:

1. Я надеюсь, что кошка просто «полосатая».

Ответ №1:

Вы можете использовать Boost::String. IIRC, для этого у них есть функция find_all / replace_all. Подробно здесь

 #include <boost/algorithm/string.hpp> 
#include <iostream> 

int main() 
{ 
  std::string s = "A cat is going. It is black-white stripped."; 
  std::cout << boost::algorithm::replace_all_copy(s, "is", "are") << std::endl; 
} 
  

Ответ №2:

строка. replace() это то, что вы хотите. Проверьте это здесь. Конечно, это придется запускать несколько раз, пока строка, которую вы хотите заменить, не вернется string::npos в find() . Попробуйте это:

 int main(int argc, char *argv[]) {

  if(argc != 3) {
    cout << "Usage: <binary> <toFind> <toReplace>" << endl;
    exit(1);
  }

  //string str(argv[1]);
  string str = "A cat is going. It is black-white striped.";
  string dest;
  string toFind(argv[1]);
  string toReplace(argv[2]);

  cout << "Original string = " << str << endl;

  while(str.find(argv[1]) != string::npos) {
    size_t pos = str.find(argv[1]);
    str.replace(pos, toFind.length(), toReplace, 0, toReplace.length());
  }

  cout << "Replaced string = " << str << endl;
  return 0;
}
  

Конечно, существует множество проверок на ошибки, которые все еще необходимо включить в эту программу. Скажем, например:

  1. str жестко запрограммирован. Не очень хорошо.
  2. Проверки не выполняются, чтобы гарантировать, что длина строки, подлежащей замене, не больше, чем сама строка str.

HTH,
Sriram.