Как правильно отображать символьные строковые литералы с шестнадцатеричным кодом с помощью std :: cout в C ++? - PullRequest
0 голосов
/ 23 февраля 2020

Как правильно отображать строковые литералы символов в шестнадцатеричном формате с помощью std :: cout в C ++?

Я хочу использовать восьмеричные и шестнадцатеричные символы для вывода строковых литералов символов с помощью std :: cout в C ++.

Я хочу напечатать "пчелу".

#include <iostream>
int main() {
    std::cout << "b\145e" << std::endl;//1
    std::cout << "b\x65e" << std::endl;//2
    return 0;
}

// 1 работает нормально, но // 2 не с шестнадцатеричной escape-последовательностью вне диапазона.

Теперь я хочу напечатать «be3».

#include <iostream>
int main() {
    std::cout << "b\1453" << std::endl;//1
    std::cout << "b\x653" << std::endl;//2
    return 0;
}

Также, // 1 работает нормально, но // 2 не с шестнадцатеричной escape-последовательностью вне диапазона.

Сейчас могу ли я прийти к выводу, что hex не является хорошим способом отображения символов строки символов ?

У меня такое чувство, что я не прав, но не знаю почему.

Может кто-нибудь объяснить, можно ли использовать гекс и как?

Ответы [ 2 ]

2 голосов
/ 23 февраля 2020

На самом деле есть пример такой же ситуации в документации cppreference для строковых литералов.

Если действительный шестнадцатеричный ди git следует за шестнадцатеричным экранированием в строковом литерале , он не сможет скомпилироваться как недопустимая escape-последовательность. Конкатенация строк может быть использована в качестве обходного пути:

Они предоставляют следующий пример:

// const char* p = "\xfff"; // error: hex escape sequence out of range
const char* p = "\xff""f";  // OK   : the literal is const char[3] holding {'\xff','f','\0'}

Применяя то, что они объясняют для вашей проблемы, мы можем напечатать строковый литерал be3 двумя способами:

std::cout << "b\x65" "3" << std::endl;
std::cout << "b\x65" << "3" << std::endl;
1 голос
/ 23 февраля 2020

Шестнадцатеричные escape-последовательности становятся \x65e и \x653, поэтому вам нужно помочь компилятору остановиться после 65:

#include <iostream>

int main() {
    std::cout << "b\x65""e" << std::endl;//2
    std::cout << "b\x65""3" << std::endl;//2
}
...