我想打印一个包含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发布于 2021-11-12 03:39:48
之所以会发生这种情况,是因为在C中,字符串是约定的null-terminated。这意味着在达到空字符之前,使用%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"};默认情况下,这些字符串将以null结尾。
另一种不更改数组的方法是为每次打印调用指定要打印的字符数,如下所示:
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]);
}这不是很优雅,我建议将寄存器视为字符串(添加空终止符)。
发布于 2021-11-12 03:49:20
首先,将寄存器名称视为字符串(即以\0结尾的字符数组)可能更容易,特别是因为您使用%s打印字符串( %s说明符需要一个以NUL结尾的字符数组)。因此,为了保存\0,您希望2D reg数组的第二维是4
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)给出了2D数组reg的大小(以字节为单位),即7*4 = 28。
您真正想要循环的是2D数组中的行数。在您的示例中,由于每个寄存器名称的大小为4(请记住包括NUL终止符!),因此可以执行以下操作:
for(int i = 0; i < sizeof(reg)/4; i++)
{
printf("%s\n", reg[i]);
}https://stackoverflow.com/questions/69937592
复制相似问题