Как сохранить CTRL-A (0x01) в строке C ++? - PullRequest
4 голосов
/ 02 ноября 2011

Я хочу сохранить CTRL-A (0x01) в строке C ++. Пробовал следующее, но это не работает. Не могли бы вы сказать, что мне здесь не хватает?

string s = "\u0001";

Я получаю сообщение об ошибке при компиляции в g ++:

error: \u0001 is not a valid universal character

Ответы [ 4 ]

5 голосов
/ 02 ноября 2011

Ошибка, которую вы получаете из-за 2.2 / 2 в C ++ 03:

Если шестнадцатеричное значение для универсального имени символа меньше 0x20 или вдиапазон 0x7F-0x9F (включительно), или если универсальное имя символа обозначает символ в базовом исходном наборе символов, то программа имеет неправильную форму.

Таким образом, для строкового литерала необходимоиспользуйте взамен \x1 или \1 (и вы можете добавить ведущие нули по вкусу).В качестве альтернативы, если вы хотите, чтобы в вашей строке был только один символ:

string s;
s.push_back(1);

или:

string s(1,1);

В C ++ 11 (2.3 / 2) ограничение ослаблено:

, если шестнадцатеричное значение для универсального имени символа вне c-char-sequence, s-char-sequence или r-char-sequence символа или строкового литерала соответствуетк управляющему символу (в любом из диапазонов 0x00–0x1F или 0x7F – 0x9F, включительно) или к символу в базовом наборе исходных символов программа плохо сформирована.

5 голосов
/ 02 ноября 2011

Поскольку у вас уже есть шестнадцатеричное значение, это очень просто:

std::string s = "\x01";

Это работает для любого шестнадцатеричного литерала.Общий формат \x<hex number>.

2 голосов
/ 02 ноября 2011

A string хранит символы ASCII;компилятор должен переводить из входного набора символов в ASCII.Это отображение определено реализацией ;Похоже, ваш поставщик компиляторов решил не отображать U + 0001 в ASCII 0x01.

Вы должны иметь возможность инициализировать строку, используя

string s = "\001";
2 голосов
/ 02 ноября 2011

Вы можете использовать

std::string s = "\001";

Обратите внимание, что восьмеричный код.

...