#c #formatting #hex
#c #форматирование #шестнадцатеричный
Вопрос:
Моя цель: я создаю приложение с использованием MFC в Visual Studio 2015. Я создал таблицу с двумя столбцами, которые содержат числа и значения многих регистров, и выглядит она следующим образом:
чтобы заполнить эту таблицу удобным способом, я хочу создать цикл for, который отправит строку LPCSTR (которая автоматически интерпретируется как const char) в функцию-член класса CListCtrl, которая называется insertItem. Я хочу, чтобы эта строка LPCSTR выглядела как шестнадцатеричное число 0x01 или 0x14, когда значение после префикса 0x будет определяться индексом цикла в шестнадцатеричной базе. например:
char buffer[3*sizeof(int)];
int l_iItem;
for (int index = REGS_NUMBER; index >= 0; index--) {
// Somehow make buffer look like 0xN when N is the index value in hex representation stuffed with
// zeroes if needed;
l_iItem = m_EditableList.InsertItem(LVIF_TEXT | LVIF_STATE, 0, buffer, 0, LVIS_SELECTED, 0, 0);
m_EditableList.SetItemText(l_iItem, 1, "00000000");
Я видел много вопросов по этой теме, но почти все они предлагали способ решения этой проблемы, который подходит только в том случае, если я хочу вывести число в стандартный вывод, но я хочу напечатать его в переменной типа char (как было хорошо сказано в комментариях). Я был бы благодарен, если бы кто-нибудь мог направить меня к соответствующей функции.
Спасибо.
===========================================================================
Как предложил Тушар, я попытался добавить эти заголовки:
#include <iostream>
#include <sstream>
#include <iomanip>
и попробовал запустить следующий код:
char* n;
int i = 7;
//std::istringstream s("2A");
n << std::hex << std::showbase << i;
std::cout << n;
ошибки, которые я получаю:
expression must have integral or unscoped enum.
'hex' is not a member of std.
'showbase' is not a member of std.
undeclared identifier.
undeclared identifier.
еще одно испытание: как было предложено в его комментариях, я попытался использовать ostringstream вместо char * следующим образом:
std::ostringstream ss;
int i = 7;
ss << std::hex << std::showbase << i;
std::string str = ss.str();
const char *output = str.c_str();
Я получаю те же ошибки, хотя я включил все необходимые заголовки. в чем может быть проблема?
Комментарии:
1. Создайте
char
массив и используйтеfprintf
для записи в него числа.2. Печать — это то, что вы хотите сделать, но вы хотите «печатать» в строку, а не в консоль. Прочитайте о
std::ostringstream
.3.
<< std::hex
не работает наchar*
. Это часть раздела IOStreams стандартной библиотеки. Он будет работать сstd::cout
,std::ofstream
,std::ostringstream
и подобными.
Ответ №1:
ios_baseamp; hex (ios_baseamp; str);
Он используется для установки флага формата базового поля для потока str в шестнадцатеричное значение. Когда базовое поле установлено в шестнадцатеричное, целочисленные значения, вставленные в поток, выражаются в шестнадцатеричной базе (т. Е. с основанием 16). Ожидается, что для входных потоков извлеченные значения также будут выражены в шестнадцатеричной базе, когда установлен этот флаг.
Если вы хотите проанализировать строку в шестнадцатеричной базе
std::istringstream(«2A») >> std::hex >> n;
Пример использования шестнадцатеричной базы.
#include <iostream>
#include <sstream>
#include <iomanip>
int main()
{
std::cout << "Parsing string "10 0x10 010"n";
int n1, n2, n3;
std::istringstream s("10 0x10 010");
s >> std::setbase(16) >> n1 >> n2 >> n3;
std::cout << "hexadecimal parse: " << n1 << ' ' << n2 << ' ' << n3 << 'n';
s >> std::setbase(0) >> n1 >> n2 >> n3;
std::cout << "prefix-dependent parse: " << n1 << ' ' << n2 << ' ' << n3 << 'n';
std::cout << "hex output: " << std::setbase(16)
<< std::showbase << n1 << ' ' << n2 << ' ' << n3 << 'n';
}
Комментарии:
1. Спасибо за ваш комментарий, но я не могу заставить его работать. не могли бы вы привести мне пример? кроме того, это не совсем решает мою проблему, поскольку я хочу, чтобы он также имел префикс «0x0» или просто «0x» в зависимости от длины целого числа (т. Е. 0x01 или 0x15)
2. Я не понимаю, что вы именно делаете. Будет иметь больше смысла, если вы покажете еще немного кода