以下代码在循环时逐个显示testbuffer的十六进制代码。
char testBuffer[5] = {0x42, 0x54, 0x43, 0x56, 0x42};
for (int i=0; i<5; i++)
{
char temp[255];
sprintf(temp, _T("%X"), testBuffer[i]);
HWND hWnd = GetDlgItem(hDlg, IDC_STATIC_READ);
if(hWnd)
{
SetWindowText(hWnd, temp);
}
}
但我希望使用不使用循环的单个变量来显示testbuffer的所有值。因为我必须使用SetWindowText一次不显示循环。
我用char来定义十六进制值。它表示字符数组的每个字符的十六进制值。
那么如何将这个字符数组显示为单个块呢?
答案 0 :(得分:0)
尝试将每个十六进制值组合成一个字符串,将它们连接成另一个字符串:
char tempword[16] ;
char temp[255] ;
* tempword= '\0' ;
for (int i= 0; ( i < 5 ) ; i ++ )
{
sprintf(tempword, "%X", testBuffer[i] ) ;
strcat( temp, tempword ) ;
}
...
SetWindowText( hWnd, temp ) ;
答案 1 :(得分:0)
移动字符串缓冲区的定义并在循环外调用SetWindowText
char testBuffer[5]={0x42,0x54,0x43,0x56,0x42};
char temp[255] = {0}; // zero initialize
for (int i=0; i<5; i++)
{
sprintf(&temp[strlen(temp)], "%02X", testBuffer[i]);
}
HWND hWnd = GetDlgItem(hDlg, IDC_STATIC_READ);
if ( hWnd )
{
SetWindowText(hWnd, temp);
}
将表达式&temp[strlen(temp)]
作为第一个参数传递给sprintf
将导致它始终附加到缓冲区中的现有字符串,这就是为什么在开始时对初始化零初始化很重要的原因。另请注意,_T(...)
宏与sprintf
的使用可能会导致编译器错误,因为该函数不喜欢宽字符串。
另一种尽可能使用标准C ++的解决方案。
char testBuffer[5]={0x42,0x54,0x43,0x56,0x42};
std::ostringstream oss;
oss << std::hex << std::setfill('0') << std::uppercase;
for(int i : testBuffer)
{
oss << std::setw(2) << i;
}
HWND hWnd = GetDlgItem(hDlg, IDC_STATIC_READ);
if ( hWnd )
{
SetWindowText(hWnd, oss.str().c_str());
}
您需要在此版本中加入标题ios
,iomanip
和sstream
。