используя \ в строке как литерал вместо escape

bool stringMatch(const char *expr, const char *str) { // do something to compare *(expr+i) == '\\' // In this case it is comparing against a backslash // i is some integer } int main() { string a = "a\sb"; string b = "ab"; cout << stringMatch(a.c_str(), b.c_str()) << endl; return 1; } 

Итак, проблема прямо сейчас: Xcode не читает в ‘\’, когда я отлаживался в функции stringMatch, expr появляется только как «asb» вместо буквального a \ sb.

И Xcode выплевывает предупреждение в строке: string a = “a \ sb”: Неизвестная управляющая последовательность

Изменить: я уже пробовал использовать «a \\ sb», он читается как «a \\ sb» как литерал.

 bool stringMatch(const char *expr, const char *str) { // do something to compare *(expr+i) == '\\' // In this case it is comparing against a backslash // i is some integer } int main() { string a = "a\\sb"; string b = "ab"; cout << stringMatch(a.c_str(), b.c_str()) << endl; return 1; } 

C и C ++ связаны с обратными косыми чертами как escape-последовательности по умолчанию. Вы должны сказать C, чтобы не использовать вашу обратную косую черту в качестве escape-последовательности, добавляя дополнительную обратную косую черту к вашей строке.

Это общие escape-последовательности:

  • \ a - Колокол (звуковой сигнал)
  • \ b - Backspace
  • \ f - Подача формы
  • \ n - Новая строка
  • \ r - Возврат каретки
  • \ t - Горизонтальная вкладка
  • \\ - Обратная косая черта
  • \ '- Единый котировочный знак
  • \ "- Double Quatation Mark
  • \ ooo - Октальное представление
  • \ xdd - Шестнадцатеричное представление

EDIT: Xcode ведет себя ненормально на вашем компьютере. Поэтому я могу предложить вам это.

 bool stringMatch(const char *expr, const char *str) { // do something to compare *(expr+i) == '\\' // In this case it is comparing against a backslash // i is some integer } int main() { string a = "a" "\x5C" "sb"; string b = "ab"; cout << stringMatch(a.c_str(), b.c_str()) << endl; return 1; } 

Не беспокойтесь о пробелах в объявлении string a , Xcode объединяет строки, разделенные пробелом.

EDIT 2: Действительно, Xcode буквально читает ваш "a\\b" , вот как он справляется с сбрасываемой обратной косой чертой. Когда вы string a = "a\\sb" на консоль string a = "a\\sb" , вы увидите, a\sb . Но когда вы передадите string a между методами в качестве аргумента или как частный член, тогда она будет воспринимать дополнительную обратную косую черту буквально. Вы должны разработать свой код с учетом этого факта, чтобы он игнорировал дополнительную обратную косую черту. Это до вас, как вы обрабатываете строку.

EDIT 3: Edit 1 - ваш оптимальный ответ здесь, но вот еще один.

Добавьте код в свой stringMatch() чтобы заменить двойную обратную косую черту одним stringMatch() .

Вам просто нужно добавить эту дополнительную строку в самом начале функции:

 expr=[expr stringByReplacingOccurrencesOfString:@"\\\\" withString:@"\\"]; 

Это должно решить проблему двойной обратной косой черты.

EDIT 4: Некоторые люди считают, что Edit 3 является ObjectiveC и, следовательно, не является оптимальным, поэтому другой вариант в ObjectiveC ++.

 void searchAndReplace(std::string& value, std::string const& search,std::string const& replace) { std::string::size_type next; for(next = value.find(search); // Try and find the first match next != std::string::npos; // next is npos if nothing was found next = value.find(search,next) // search for the next match starting after // the last match that was found. ) { // Inside the loop. So we found a match. value.replace(next,search.length(),replace); // Do the replacement. next += replace.length(); // Move to just after the replace // This is the point were we start // the next search from. } } 

РЕДАКТИРОВАТЬ 5: Если вы измените const char * в stringMatch() на строку, это будет менее сложным для вас.

 expr.replace(/*size_t*/ pos1, /*size_t*/ n1, /*const string&*/ str ); 

PS У вас есть все ответы сейчас, так что вам до того, что вы реализуете, что дает вам наилучшие результаты.

Xcode выплевывает это предупреждение, потому что он интерпретирует \s в «a \ sb» как escape-последовательность, но \s не является допустимой escape-последовательностью. Он заменяется только s поэтому строка становится «asb».

Исключение обратного слэша, такого как "a\\sb" является правильным решением. Если это как-то не сработало для вас, напишите более подробную информацию об этом.

Вот пример.

 #include  #include  int main() { std::string a = "a\\sb"; std::cout << a.size() << ' ' << a << '\n'; } 

Результат этой программы выглядит так:

4 a \ sb

Если у вас есть другой выход, отправьте его. Также, пожалуйста, напишите точно, какую проблему вы наблюдали, когда вы раньше пытались «a \\ sb».


Регулярные выражения могут быть больны в C ++, потому что обратные слэши должны быть экранированы таким образом. C ++ 11 имеет необработанные строки, которые не допускают какого-либо экранирования, так что избежать обратного слэша не R"(a\sb)" : R"(a\sb)" .

  • Чтение информации в формате MP3 с использованием объектива c
  • Подавление устаревших предупреждений в Xcode
  • Игнорировать все предупреждения в определенном файле, используя LLVM / Clang
  • Ошибка Xcode 6 при отправке архива
  • didFailToReceiveAdWithError не работает для симуляторов iOS 8
  • Неожиданно найдено nil IBOutlet в prepareForSegue
  • Xcode / LLDB: как получить информацию об исключении, которое было просто выброшено?
  • Декомпиляция библиотек Objective-C
  • Как включить NSZombie в Xcode?
  • Что такое Xcode «нет такой ошибки файла или каталога»?
  • Добавление неизвестного количества строк в «Статические ячейки» UITableView
  • Interesting Posts

    В C # проверьте, что имя файла * возможно * действительное (не то, что оно существует)

    Как настроить беспроводную сеть как приватную, а не публичную?

    Почему Android не использует больше перечислений?

    Создание WPF BitmapImage из MemoryStream png, gif

    Подсчет смежных свопов, необходимых для преобразования одной перестановки в другую

    Visual Studio, по-видимому, случайно использует американскую раскладку клавиатуры

    Есть ли эквивалент xkill для Windows 7?

    сделать выпадающий список элементов невыбранным

    Как перенести настройки Notepad ++?

    Как я могу использовать jQuery в сценариях Greasemonkey в Google Chrome?

    Проблемы с PHP / cURL / Fedora разрешают имя хоста, возможно, проблему DNS?

    Резервное копирование системы, Резервное копирование диска, Различия в резервах раздела

    Почему компилятор c # испускает Activator.CreateInstance при вызове new in с общим типом с новым () ограничением?

    Почему порядок альтернатив имеет значение в регулярном выражении?

    Автоматический повторный набор для VPN-соединений PPTP в Windows 8

    Давайте будем гением компьютера.