【问题标题】:Printing a hex array in console在控制台中打印十六进制数组
【发布时间】:2018-11-03 03:20:44
【问题描述】:

我有一个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 之间交换,因此循环无限运行。

p>

对此的任何解决方案。

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    增加x[]的大小,它应该可以工作。

    【讨论】:

    • 好的,现在我不确定了。但即使不是,"00\0" 仍然是三个字符 - 请记住每个字符串末尾的 '\0'
    【解决方案2】:
    char x[2];
    

    “十六进制输出”只有两个字节,但null 字符没有可用空间。

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

    x 数组大小增加到 3:

    char x[3];
    

    根据sprintf:

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

    因此,您总共有三个字符包括 null 字符。

    【讨论】:

      【解决方案3】:

      根据您在 state[4][4] 中的值,您很可能最终会 溢出x 数组(请记住,您最多需要一个位置来存放FF(2 个字符)+ 1 用于终止'\0')。 那是未定义的行为。 修复它(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);
      }
      

      【讨论】:

      • @codekaizer 用于 OP 的 sprintf(这不是必需的,因为 iostream 也可以打印十六进制数字,但我保留了它,因为它在问题中)。我把它改成了cstdio,如果你是这个意思。
      • 这解决了这个问题,但是我有一个问题,因为我必须继续我的工作,所以我将循环语句复制了 16 次作为临时解决方案。 Ans 我使用了char x[2],但它工作正常,为什么?
      • @Nilesh 也许你的数字是个位数,或者数组越界访问没有最终覆盖任何关键的东西(当你的程序未定义时会发生什么未定义)
      • '0xC0000005' 在出现一些未定义的行为时显示,但控制台上没有此类错误代码
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      相关资源
      最近更新 更多