Я пытаюсь понять, как найти и заменить строку (содержащую escape-символы "\"). Кажется, я не могу заставить это работать, мне всегда не хватает количества escape-символов.
Я пытался изменить свои строки на необработанные строки, но это не сработало для меня.
LPCWSTR ext1 = _wcslwr(ObjectAttributes->ObjectName->Buffer);
LPCWSTR ext2 = L"c:\\users\\vm1\\documents";
LPCWSTR ext3 = L"c:\\users\\vm1\\desktop";
wstring ext4 = Replace(ext1, ext2, ext3);
Переменная "_wcslwr(ObjectAttributes->ObjectName->Buffer)" равна L"\??\c:\users\vm1\documents\temp22.txt".
Я продолжаю получать строку результата функции замены ниже, чтобы она равнялась "\??\c:\users\vm1\desktopp22.txt". Результат должен быть "\??\c:\users\vm1\desktop\temp22.txt". Почему он вырезал часть «\ tem»? Я думаю, это связано с тем, что «\» фактически считается одним символом, а не (2) символами.
Вызываемая функция находится ниже;
wstring Replace(const wstring& orig, const wstring& fnd, const wstring& repl)
{
wstring ret = orig;
size_t pos = 0;
while (true)
{
pos = ret.find(fnd, pos);
if (pos == wstring::npos) // no more instances found
break;
ret.replace(pos, pos + fnd.size(), repl); // replace old string with new string
pos += repl.size();
}
return ret;
}
Я ожидаю, что вывод функции «Заменить» выше будет;
"\\??\\c:\\users\\vm1\\desktop\\temp22.txt"
Как вы выполняете этот тип поиска и замены?
Переменные типа LPCWSTR не содержат escape-символов. Подходят только строковые литералы в файле .cpp. Такая путаница обычно возникает из-за того, что отладчик показывает содержимое переменных в том же формате, который вы использовали бы в исходном коде C++. Щелкните значок подзорной трубы, чтобы активировать всплывающее окно визуализатора текста, показывающее, как оно выглядит на самом деле.
Извините, добавил вызов в функцию "Заменить". Даже с зеркалом в LPCWSTR есть символы, которые мой "fnd.size()" не распознает. Это мой вопрос, должен ли я использовать что-то другое, кроме ".size()". Я думал преобразовать литеральную строку в необработанный литерал. Я пробовал это, но он выдавал ошибки для переменных ext1, ext2 и ext3. Что мне нужно сделать, чтобы найти правильную длину этих строк (учитывать все символы между кавычками)?
Речь идет не об escape-символах, которые на самом деле не являются частью строки, а присутствуют только в вашем исходном коде. Проблема в ваших аргументах std::wstring::replace
.
Ваши границы такие, как если бы вы использовали перегрузку const_iterator, const_iterator
, но на самом деле вы используете перегрузку start, length
. Это не start, end
!
Так:
ret.replace(pos, fnd.size(), repl);
то есть удалить pos +
.
Вы заменили на pos
(4) больше символов, чем планировали. ?
И, да, в библиотеке строк полно подобных маленьких подводных камней, к сожалению.
В качестве примечания, пожалуйста, представьте ваш минимальный воспроизводимый пример в форме, более похожей на ту, что показана в моей демонстрации, чтобы нам не пришлось возиться с ним, чтобы скомпилировать и продемонстрировать проблему! Спасибо!
Спасибо, Светочка, все получилось! Большое спасибо, помечено как правильный ответ!
На самом деле мне потребовалось добрых пять минут поиграть (и немного почесать голову), чтобы заметить это, поэтому я не удивлен, что это вас зацепило! Глупые перегрузки...
Вы не сказали, как вы звоните
Replace()
.