Показанный алгоритм уже корректно обходит исходную строку и добавляет слеш перед каждым совпадением. Утверждение о неправильном обходе не подтверждается этим фрагментом.
Переписывание функции экранирования символов
Показанный алгоритм уже корректно обходит исходную строку и добавляет слеш перед каждым совпадением. Утверждение о неправильном обходе не подтверждается этим фрагментом.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дана реализация функции mark_char, предназначенной для добавления символа обратного слеша перед каждым вхождением указанного символа в строке. Текущий вариант обхода строки реализован неверно, из‑за чего результат может быть некорректным. Необходимо исправить алгоритм так, чтобы он последовательно проходил по всем символам исходной строки и возвращал новую строку, где каждый найденный символ будет экранирован.
std::string mark_char(const std::string& src, char target) {
if (src.empty()) {
return "";
}
std::string out;
for (char ch : src) {
if (ch == target) {
out += '\\';
}
out += ch;
}
return out;
}
Ответ
Показанный алгоритм уже корректно обходит исходную строку и добавляет слеш перед каждым совпадением. Утверждение о неправильном обходе не подтверждается этим фрагментом.
Можно лишь упростить пустой случай и заранее зарезервировать минимальный объём:
std::string mark_char(const std::string& src, char target) {
std::string out;
out.reserve(src.size());
for (char current : src) {
if (current == target) out.push_back('\\');
out.push_back(current);
}
return out;
}
Пустой вход естественно даёт пустой выход. Исходник не изменяется, а вставленные слеши не обходятся повторно. При target, равном слешу, каждый исходный слеш удваивается. Это посимвольное байтовое преобразование, не универсальное экранирование для всех форматов.