Вопрос касается замены character
, но, поскольку я нашел эту страницу очень полезной (особенно замечание Конрада ), я хотел бы поделиться этой более обобщенной реализацией, которая позволяетиметь дело также с substrings
:
std::string ReplaceAll(std::string str, const std::string& from, const std::string& to) {
size_t start_pos = 0;
while((start_pos = str.find(from, start_pos)) != std::string::npos) {
str.replace(start_pos, from.length(), to);
start_pos += to.length(); // Handles case where 'to' is a substring of 'from'
}
return str;
}
Использование:
std::cout << ReplaceAll(string("Number Of Beans"), std::string(" "), std::string("_")) << std::endl;
std::cout << ReplaceAll(string("ghghjghugtghty"), std::string("gh"), std::string("X")) << std::endl;
std::cout << ReplaceAll(string("ghghjghugtghty"), std::string("gh"), std::string("h")) << std::endl;
Выходы:
Number_Of_Beans
XXjXugtXty
hhjhugthty
РЕДАКТИРОВАТЬ:
Выше может быть реализовано более подходящим способом, в случае если ваши выступлениябеспокойство, ничего не возвращая (void
) и внося изменения непосредственно в строку str
, заданную в качестве аргумента, передавая по адресу вместо по значению .Это позволило бы избежать бесполезного и дорогостоящего копирования исходной строки при возврате результата.Ваш звонок, затем ...
Код:
static inline void ReplaceAll2(std::string &str, const std::string& from, const std::string& to)
{
// Same inner code...
// No return statement
}
Надеюсь, что это будет полезно для некоторых других ...