Создайте отдельную строку и пройдите исходную один раз. Перед каждым совпадением добавляйте обратный слеш, затем сам символ. Исходная строка останется неизменной.
Экранирование заданного символа в строке
Создайте отдельную строку и пройдите исходную один раз. Перед каждым совпадением добавляйте обратный слеш, затем сам символ. Исходная строка останется неизменной.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать функцию, которая принимает строку и символ, и возвращает новую строку, в которой каждое вхождение указанного символа предшествует обратный слеш, т.е. символ «экранируется». Функция должна работать без изменения оригинальной строки.
std::string mark_char(const std::string& s, char ch) {
// реализовать
}
Пример: Вход: "a:b:c", символ ':' → Выход: "a\:b\:c"
Ответ
Создайте отдельную строку и пройдите исходную один раз. Перед каждым совпадением добавляйте обратный слеш, затем сам символ. Исходная строка останется неизменной.
std::string mark_char(const std::string& s, char ch) {
std::string result;
result.reserve(s.size());
for (char current : s) {
if (current == ch) result.push_back('\\');
result.push_back(current);
}
return result;
}
При ch, равном обратному слешу, каждый такой символ удваивается. Время амортизированно O(n), дополнительная память O(n). Это экранирование одного байта по заданному правилу, а не универсальная защита для SQL, HTML или командной оболочки.