在控制台

时间:2018-05-24 02:45:06

标签: c++ for-loop multidimensional-array hex nested-loops

我有一个uint8_t类型数组,4x4维度,我使用嵌套for循环显示数组,十六进制值通过sprintf()转换为十六进制字符串。

void hexD(uint8_t state[4][4])
{
char x[2];
for(int i = 0; i < 4; i++)
{
    cout << "\n";
    for(int  j = 0; j < 4; j++)
    {
        cout << j <<"\n"; //displays the value of j
        sprintf(x, "%x", state[i][j]);
        cout << x << "\t";
    }
}
}

问题是内部for循环无休止地运行,因为j的值从0开始然后是1然后是2但是不是转到3它会回到1,j在1和2之间交换,因此循环无限运行。

任何解决方案。

感谢。

3 个答案:

答案 0 :(得分:0)

您的x只有两个空格,但您要在其中写入更多字符。例如,十六进制0"00",两个字符加上结束 '\0'
这会覆盖邻近的内存,而你的j恰好在那里并被覆盖。

增加x[]的大小,它应该有效。

答案 1 :(得分:0)

根据state[4][4]中的值,您很可能会结束 溢出x数组(请记住,对于终止FF,您最多需要一个'\0'(2个字符)+ 1的位置。 这是未定义的行为。 修复它(char x[3];),你应该没问题。这是mcve

#include <iostream>
#include <cstdint>
#include <cstdio>
using namespace std;
void hexD(uint8_t state[4][4])
{
char x[3];
for(int i = 0; i < 4; i++)
{
    cout << "\n";
    for(int  j = 0; j < 4; j++)
    {
        cout << j <<"\n"; //displays the value of j
        sprintf(x, "%x", state[i][j]);
        cout << x << "\t";
    }
}
}
uint8_t state[4][4]={
    255,255,255,255,
    0, 1, 2, 3,
    0, 1, 2, 3,
    0, 1, 2, 3,
};
int main()
{
    hexD(state);
}

答案 2 :(得分:0)

x & y

你的&#34;十六进制输出只有两个字节&#34;但没有char x[2]; 字符的可用空间。

将更多内容写入容量较小的数组未定义的行为

null数组大小增加到3:

x

因为按sprintf

  

终止空字符会自动附加到   内容。

因此,您总共有三个字符包括 char x[3]; 个字符。