首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印出使用c#编写的二维字符数组。

打印出使用c#编写的二维字符数组。
EN

Stack Overflow用户
提问于 2021-11-12 03:27:01
回答 2查看 59关注 0票数 0

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

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2021-11-12 03:39:48

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

要在不更改太多代码的情况下获得所需的输出,可以在每个寄存器的末尾添加一个空字符,如下所示

代码语言:javascript
复制
char reg[][4] = {
   {'$', 's', '0', 0},
   {'$', 's', '1', 0},
   {'$', 's', '2', 0},
   {'$', 's', '3', 0},
   {'$', 's', '4', 0},
   {'$', 's', '5', 0},
   {'$', 's', '6', 0}
};

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

代码语言:javascript
复制
char reg[][4] = {"$s0", "$s1", "$s2", "$s3", "$s4", "$s5", "$s6"};

默认情况下,这些字符串将以null结尾。

另一种不更改数组的方法是为每次打印调用指定要打印的字符数,如下所示:

代码语言:javascript
复制
printf("%.3s\n", reg[i]);

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

代码语言:javascript
复制
#define REGISTER_STRING_SIZE 3

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

然后在你的循环中

代码语言:javascript
复制
    for(int i = 0; i < sizeof(reg)/REGISTER_STRING_SIZE; i++)
    {
        printf("%.3s\n", reg[i]);
    }

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

票数 1
EN

Stack Overflow用户

发布于 2021-11-12 03:49:20

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

代码语言:javascript
复制
char reg[][4] = {
   {'$', 's', '0', '\0'},
   {'$', 's', '1', '\0'},
   {'$', 's', '2', '\0'},
   {'$', 's', '3', '\0'},
   {'$', 's', '4', '\0'},
   {'$', 's', '5', '\0'},
   {'$', 's', '6', '\0'}
};

或者,您可以将这些内容直接作为字符串输出:

代码语言:javascript
复制
char reg[][4] = {
   "$s0",
   "$s1",
   "$s2",
   "$s3",
   "$s4",
   "$s5",
   "$s6"
};

现在进入循环。循环条件中的sizeof(reg)给出了2D数组reg的大小(以字节为单位),即7*4 = 28。

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

代码语言:javascript
复制
for(int i = 0; i < sizeof(reg)/4; i++)
{
    printf("%s\n", reg[i]);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69937592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档