零基础C语言开发者求助:二维字符数组打印格式不符问题
解决二维字符数组打印格式问题的分析
嗨,我来帮你弄明白为什么一开始的代码输出不对,以及修改后的代码为什么能解决问题~
原代码的问题所在
你最初的代码里,定义了一个char game[3][3] = { "OOO", "OOO", "OOO" };,然后用printf("%s", game[k])来打印每一行。这里的核心问题是:
- 在C语言中,用双引号包裹的字符串(比如"OOO")会自动在末尾添加一个字符串终止符
'\0',用来标记字符串的结束。 - 但你定义的
game每行只有3个字符的空间,刚好放下三个'O',根本没地方放'\0'。 - 当
printf用%s格式打印时,它会从起始地址开始一直读取,直到找到'\0'才停止。这就导致它越界读取了数组后面的内存内容,所以你看到的输出是乱的(多出来的O或者不确定的字符),完全不符合预期。
修改后代码的原理
你改成嵌套循环逐个打印字符的方式就完美避开了这个问题:
- 外层循环遍历每一行,内层循环遍历该行的每个字符。
- 用
%c格式逐个打印game[i][j],并且手动添加空格" ",这样每个'O'之间都有空格。 - 每打印完一行的三个字符后,再打印换行符
"\n",正好输出成你想要的:O O O O O O O O O
额外小提示(可选)
如果你想继续用打印字符串的方式实现类似效果,可以调整数组的定义,给每行多留一个位置放终止符:
char game[3][4] = { "OOO", "OOO", "OOO" };
不过这样打印出来的是OOO每行,没有空格。如果要带空格的话,直接把字符串写成"O O O",数组对应改成char game[3][6] = { "O O O", "O O O", "O O O" };,再用printf("%s\n", game[k])也能得到正确格式,但显然嵌套循环的方式更灵活,比如后续要修改每个位置的字符时,调整起来更方便。
内容的提问来源于stack exchange,提问作者Ada
相关产品推荐
相关产品推荐

