Правила для символов строки строки C ++

Каковы правила для escape-символа \ в строковых литералах? Есть ли список всех символов, которые были экранированы?

В частности, когда я использую \ в строковом литерале в gedit и следую за ним любыми тремя числами, он окрашивает их по-разному.

Я пытался создать std::string построенный из литерала с символом 0 за которым следует нулевой символ ( \0 ), за которым следует символ 0 . Однако подсветка синтаксиса предупреждала меня, что, возможно, это создаст нечто вроде символа 0 за которым следует нулевой символ ( \00 , aka \0 ), то есть всего два символа.

Для решения только этой проблемы это лучший способ сделать это:

 std::string ("0\0" "0", 3) // String concatenation 

И есть ли какая-то ссылка на то, что делает escape-символ в строковых литералах вообще? Что такое «\ a», например?

Управляющие символы:

(Hex-коды предполагают кодировку ASCII-совместимого символа).

  • \a = \x07 = предупреждение (звонок)
  • \b = \x08 = \x08
  • \t = \x09 = горизонтальная вкладка
  • \n = \x0A = \x0A (или строка)
  • \v = \x0B = вертикальная вкладка
  • \f = \x0C = форма feed
  • \r = \x0D = возврат каретки
  • \e = \x1B = escape (нестандартное расширение GCC)

Пунктуационные символы:

  • \" = кавычка (обратная косая черта не требуется для '"' )
  • \' = апостроф (обратная косая черта не требуется для "'" )
  • \? = знак вопроса (используемый для избежания триграфов)
  • \\ = обратная косая черта

Числовые ссылки на символы:

  • \ + до 3-х восьмеричных цифр
  • \x + любое число шестнадцатеричных цифр
  • \u + 4 шестнадцатеричные цифры (Unicode BMP, новый в C ++ 11)
  • \U + 8 шестнадцатеричных цифр (астральные плоскости Юникода, новые в C ++ 11)

\0 = \00 = \000 = восьмеричный эквал для нулевого символа

Если вам нужен фактический символ цифры после \0 , то да, я рекомендую конкатенацию строк. Обратите внимание, что пробелы между частями литерала необязательны, поэтому вы можете написать "\0""0" .

\ 0 будет интерпретироваться как восьмеричная escape-последовательность, если за ней следуют другие цифры, поэтому \ 00 будет интерпретироваться как один символ. (\ 0 также технически является восьмеричной escape-последовательностью, по крайней мере, в C).

То, как вы это делаете:

 std::string ("0\0" "0", 3) // String concatenation 

работает, потому что эта версия конструктора принимает массив символов; если вы попытаетесь просто передать «0 \ 0» «0» в качестве const char *, он будет рассматривать его как строку C и только скопировать все до нулевого символа.

Вот список escape-последовательностей .

\a – символ звонка / предупреждения, который на некоторых системах запускает звук. \nnn , представляет произвольный символ ASCII в восьмеричной базе. Однако \0 особенность в том, что он представляет нулевой символ независимо от того, что.

Чтобы ответить на ваш первоначальный вопрос, вы также можете избежать ваших символов «0», а именно:

 std::string ("\060\000\060", 3); 

(поскольку ASCII ‘0’ равно 60 в восьмеричном)

В документации MSDN есть довольно подробная статья об этом, а также cppreference

Я оставил что-то вроде этого в качестве комментария, но я чувствую, что он, вероятно, нуждается в большей видимости, поскольку ни один из ответов не упоминает этот метод:

Метод, который я теперь предпочитаю для инициализации std::string с непечатаемыми символами вообще (и вложенными нулевыми символами в частности), должен использовать функцию C ++ 11 списков инициализаторов.

 std::string const str({'\0', '6', '\a', 'H', '\t'}); 

Мне не требуется выполнять подсчет количества ошибок, которые я использую с ошибкой, так что, если позже я захочу вставить «\ 013» где-то посередине, я могу и весь мой код по-прежнему будет работать , Это также полностью оборачивает любые проблемы, связанные с неправильной последовательностью эвакуации.

Единственный недостаток – это все лишние ' и персонажи.

С магией пользовательских литералов у нас есть еще одно решение. C ++ 14 добавлен оператор std::string literal.

 using namespace std::string_literals; auto const x = "\0" "0"s; 

Создает строку длиной 2 с символом ‘\ 0’ (нуль), за которым следует символ ‘0’ (цифра нуль). Я не уверен, более или менее ясен, чем конструктор initializer_list , но он по крайней мере избавляется от символов «и».

  • Использование printf с не нулевой завершаемой строкой
  • Использование локалей с Java toLowerCase () и toUpperCase ()
  • Java String - Смотрите, содержит ли строка только числа, а не буквы
  • Понимание логики в CaseInsensitiveComparator
  • Домен верхнего уровня из URL-адреса в C #
  • В Java, как проверить, содержит ли строка подстроку (игнорируя регистр)?
  • Считать слова в строковом методе?
  • Что такое хорошая 64-битная hash-функция в Java для текстовых строк?
  • Могу ли я избежать двойной кавычки в стенографическом литерале?
  • Как преобразовать двоичную строку в базовое целое число 10 в Java
  • std :: string to char *
  • Interesting Posts

    Как написать обратную косую черту (\) в строке?

    Как использовать ffmpeg для кодирования файла с возможной ошибкой?

    Intellisense в IntelliJ больше не работает

    R: Работа с TRUE, FALSE, NA и NaN

    Как получить FacesContext в фильтре

    Синглтоны действительно так плохо?

    Рассчитайте, когда будет выполняться задание cron, а затем в следующий раз

    Это плохо для дефрагментации ssd? Или просто бессмысленно?

    Почему вызовы Cdecl часто несовместимы в «стандартной» конвенции P / Invoke?

    Стратегии совместного использования паролей для нескольких пользователей, таких как жена мужа?

    Android: 2 или более ExpandableListView внутри навигационного ящика

    Как RAID 1 определяет, какой диск должен выступать в качестве источника для перестройки?

    .NET Console TextWriter, который понимает Отступ / Неподвижный / IndentLevel

    Как отредактировать частичный формат в Rails?

    Без подключения к Интернету после обновления до Windows 10

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