Есть ли простой способ избежать всех вхождений \ в строку? Я начинаю со следующей строки:
#include <string>
#include <iostream>
std::string escapeSlashes(std::string str) {
// I have no idea what to do here
return str;
}
int main () {
std::string str = "a\b\c\d";
std::cout << escapeSlashes(str) << "\n";
// Desired output:
// a\\b\\c\\d
return 0;
}
В основном я ищу вопрос, обратный это. Проблема в том, что я не могу найти \ в строке, потому что C++ уже рассматривает его как escape-последовательность.
ПРИМЕЧАНИЕ:Во-первых, я не могу изменить строку str. Он анализируется из файла LaTeX. Таким образом, это ответов на аналогичный вопрос не применяется.Редактировать: Анализ не удался из-за несвязанной проблемы, вопрос здесь о строковых литералах.
Редактировать: Есть хорошие решения для поиска и замены известных escape-последовательностей, таких как ответ это. Другой вариант - использовать boost::regex("\p{cntrl}"). Однако я не нашел ни одного, который работал бы с неизвестными (ошибочными) escape-последовательностями.
Добавляйте \ перед каждой косой чертой и попробуйте
Для поиска специальных символов поместите перед ними \ , например \\ . Вам не нужно изменять данные источник.
Кстати, вам также не нужно «избегать» исходных данных. Это нормально и так. Если вы попытаетесь проверить символы в отладчике, вы увидите, что символ \ отображается как \\ . Экранирование необходимо только для строковых литералов в исходном коде. Если бы вы использовали cout << str, вы бы увидели исходную строку без изменений
Я бы предпочел не трогать код парсинга. Возникает связанный с этим вопрос: есть ли способ найти в строке escape-символ любой?
Что вы имеете в виду под "Это проанализировано из файла LaTeX"? У вас есть сценарий, который извлекает строки из ваших источников LaTeX и производит исходный код C++ в качестве вывода? (В этом случае исправьте сценарий.) Или ваш код C++ читает LaTeX в качестве входных данных? (В этом случае у вас уже есть буквальные символы \ в вашей строке, и ваш примерный код не отражает то, что вы делаете.)
Я обнаружил проблему с парсером, и она не связана с этим вопросом. Пытаясь понять проблему, используя строковые литералы вместо анализируемой строки, я только усугубил ситуацию. Я удалю записку, так как она вводит в заблуждение.





Вы можете использовать необработанный строковый литерал. См. http://en.cppreference.com/w/cpp/language/string_literal
#include <string>
#include <iostream>
int main() {
std::string str = R"(a\b\c\d)";
std::cout << str << "\n";
return 0;
}
Выход:
a\b\c\d
Невозможно преобразовать строковый литерал a\b\c\d в a\\b\\c\\d, т.е. избежать обратной косой черты.
Почему? Поскольку компилятор преобразует \c и \d непосредственно в c и d, соответственно, выдает предупреждение о Unknown escape sequence \c и Unknown escape sequence \d (\b в порядке, поскольку это допустимая escape-последовательность). Это происходит непосредственно со строковым литералом, прежде чем вы сможете с ним работать.
Чтобы убедиться в этом, вы можете скомпилировать на ассемблер
gcc -S main.cpp
и вы найдете следующую строку где-нибудь в своем ассемблерном коде:
.string "a\bcd"
Таким образом, ваша проблема либо в вашей функции синтаксического анализа, либо вы используете строковые литералы для экспериментов, и вместо этого вы должны использовать необработанные строки R"(a\b\c\d)".
Как насчет того, чтобы показать образец файла и код синтаксического анализа?