【问题标题】:Printing out a 2d array of char in c [duplicate]在c中打印出一个二维char数组[重复]
【发布时间】:2021-11-12 03:27:00
【问题描述】:

我想打印出包含 mips 寄存器的二维 char 数组。我想分别打印每个寄存器。但是我当前的代码将所有寄存器一起打印出来。有没有更好的方法来解决这个问题,比如使用字符的双指针数组?

My code so far:
char reg[][3] = {
   {'$', 's', '0'},
   {'$', 's', '1'},
   {'$', 's', '2'},
   {'$', 's', '3'},
   {'$', 's', '4'},
   {'$', 's', '5'},
   {'$', 's', '6'},
};

int main(void){

   for(int i = 0; i < sizeof(reg); i++)
   {
      printf("%s\n", reg[i]);
   }
   return 0;
}
My output:
$s0$s1$s2$s3$s4$s5$s6
$s1$s2$s3$s4$s5$s6
$s2$s3$s4$s5$s6
$s3$s4$s5$s6
$s4$s5$s6
$s5$s6
$s6
But I want my output to be like this:
$s0
$s1
$s2
$s3
$s4
$s5
$s6

【问题讨论】:

  • %s 需要一个 NUL 终止字符串。您的数组是字符序列而不是字符串。将数组第二维大小增加 1 以确保每个条目都以 0 结尾。另外,请注意您可以使用char reg[][4] = { "$s0", "$s1", ...}

标签: c mips


【解决方案1】:

首先,将寄存器名称视为字符串可能更容易(即以\0 结尾的字符数组),特别是因为您使用%s 打印出字符串(%s说明符需要一个以 NUL 结尾的字符数组)。因此,您希望 2D reg 数组的第二维为 4,以便保存 \0

char reg[][4] = {
   {'$', 's', '0', '\0'},
   {'$', 's', '1', '\0'},
   {'$', 's', '2', '\0'},
   {'$', 's', '3', '\0'},
   {'$', 's', '4', '\0'},
   {'$', 's', '5', '\0'},
   {'$', 's', '6', '\0'}
};

或者,您可以直接将它们写成字符串:

char reg[][4] = {
   "$s0",
   "$s1",
   "$s2",
   "$s3",
   "$s4",
   "$s5",
   "$s6"
};

现在进入循环。循环条件中的 sizeof(reg) 为您提供二维数组 reg 的大小(以字节为单位),即 7*4 = 28。

您真正想要循环的是二维数组中的行数。在您的情况下,由于每个寄存器名称的大小为 4(请记住包括 NUL 终止符!),您可以执行以下操作:

for(int i = 0; i < sizeof(reg)/4; i++)
{
    printf("%s\n", reg[i]);
}

【讨论】:

    【解决方案2】:

    发生这种情况是因为在 C 中,字符串按照约定是以空字符结尾的。这意味着使用 %s 说明符调用的 printf 将在到达空字符之前不会停止

    要在不更改大部分代码的情况下获得所需的输出,您可以像这样在每个寄存器的末尾添加一个空字符

    char reg[][4] = {
       {'$', 's', '0', 0},
       {'$', 's', '1', 0},
       {'$', 's', '2', 0},
       {'$', 's', '3', 0},
       {'$', 's', '4', 0},
       {'$', 's', '5', 0},
       {'$', 's', '6', 0}
    };
    

    但这不是很漂亮。你可以这样写:

    char reg[][4] = {"$s0", "$s1", "$s2", "$s3", "$s4", "$s5", "$s6"};
    

    这些字符串默认为空终止。

    在不更改数组的情况下执行此操作的另一种方法是指定每次打印调用要打印多少个字符,如下所示:

    printf("%.3s\n", reg[i]);
    

    编辑:正如ice05 的回答所指出的,您的循环条件也是错误的。此代码可能会生成分段错误。在 C 中处理这种情况的常用方法是使用预处理器宏,例如:

    #define REGISTER_STRING_SIZE 3
    
    char reg[][REGISTER_STRING_SIZE] = {
       {'$', 's', '0'},
       {'$', 's', '1'},
       {'$', 's', '2'},
       {'$', 's', '3'},
       {'$', 's', '4'},
       {'$', 's', '5'},
       {'$', 's', '6'},
    };
    

    然后在你的循环中,

        for(int i = 0; i < sizeof(reg)/REGISTER_STRING_SIZE; i++)
        {
            printf("%.3s\n", reg[i]);
        }
    

    这不是很优雅,我建议将寄存器视为字符串(添加空终止符)。

    【讨论】:

      猜你喜欢
      • 2011-07-07
      • 1970-01-01
      • 2014-02-25
      • 1970-01-01
      • 2020-11-17
      • 2013-09-12
      • 2013-07-26
      • 2018-12-02
      相关资源
      最近更新 更多