如何解决C++ cout 打印二维字符数组的全部内容
我正在编写一个井字游戏来学习 C++。
我想将游戏板存储在一个 2D 字符数组中:
char playerBoard[5][14] {
{'2',' ','>','_','|','\n'},{'1',{'0',{' ','^','0','1','2','\n'}
};
我想用 cout 打印数组:
for (int i = 0; i < 5; i++) {
cout << playerBoard[i];
}
当我尝试时,每次迭代都会打印 playerboard
的全部内容,从第一个数组开始:
2 > _ | _ | _
1 > _ | _ | _
0 > _ | _ | _
^ ^ ^
0 1 2
1 > _ | _ | _
0 > _ | _ | _
^ ^ ^
0 1 2
0 > _ | _ | _
^ ^ ^
0 1 2
^ ^ ^
0 1 2
0 1 2
playerBoard 的全部内容打印为:
cout << playerBoard[0];
这里发生了什么?
解决方法
您的五个数组子元素中没有一个是以 nul
结尾的字符串(可能除了最后一个,但这依赖于未定义的行为)。
带有 std::cout <<
操作数(或 char*
操作数,decays into a char*
)的 char[]
操作假定一个以 nul
结尾的字符串;在您的情况下,由于缺少终止符,将打印缓冲区,直到在某处找到一个。这似乎是在整个数组块之后。
要解决此问题,请将子数组的大小增加到 15 个字符并添加所需的 nul
(零)终止符:
int main()
{
char playerBoard[5][15]{
{'2',' ','>','_','|','\n','\0'},{'1',{'0',{' ','^','0','1','2','\0'}
};
for (int i = 0; i < 5; i++) {
std::cout << playerBoard[i];
}
return 0;
}
,
您有未定义的行为,因为 std::cout << playerBoard[i];
期望 playerBoard[i]
是(指向第一个元素的指针)空终止数组,并且没有空字符 (char{0}
)。
要解决此问题,请使用适用于非空终止字符数组的 std::cout.write(s,count)
或 std::string_view
:
for (int i = 0; i < 5; i++) {
std::cout.write(playerBoard[i],std::size(playerBoard[i]));
// Or
std::cout << std::string_view(playerBoard[i],std::size(playerBoard[i]));
}
或者,在末尾添加一个空终止符:
char playerBoard[][14] {
{'2','\n'},{0}
};
// Print the whole array
std::cout << *playerBoard;
// (You can still print individual lines the same way like as above)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。