C++ cout 打印二维字符数组的全部内容
C++ cout prints entire contents of 2D char array
我正在写一个井字游戏来学习C++。
我想将游戏板存储在二维字符数组中:
char playerBoard[5][14] {
{'2',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n'},
{'1',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n'},
{'0',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n'},
{' ',' ',' ',' ','^',' ',' ',' ','^',' ',' ',' ','^','\n'},
{' ',' ',' ',' ','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];
这是怎么回事?
None 的五个数组子元素是一个以 nul
结尾的字符串(可能最后一个除外,但它依赖于未定义的行为)。
带有 char*
操作数(或 char[]
操作数,decays into a char*
)的 std::cout <<
操作假定一个以 nul
结尾的字符串;在您的情况下,由于缺少终止符,因此会打印缓冲区,直到在某处找到一个为止。这似乎是在整个数组块之后。
要解决此问题,请将子数组的大小增加到 15 个字符并添加所需的 nul
(零)终止符:
int main()
{
char playerBoard[5][15]{
{'2',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n','[=10=]'},
{'1',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n','[=10=]'},
{'0',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n','[=10=]'},
{' ',' ',' ',' ','^',' ',' ',' ','^',' ',' ',' ','^','\n','[=10=]'},
{' ',' ',' ',' ','0',' ',' ',' ','1',' ',' ',' ','2','\n','[=10=]'}
};
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)
or 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'},
{'1',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n'},
{'0',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n'},
{' ',' ',' ',' ','^',' ',' ',' ','^',' ',' ',' ','^','\n'},
{' ',' ',' ',' ','0',' ',' ',' ','1',' ',' ',' ','2','\n'},
{0}
};
// Print the whole array
std::cout << *playerBoard;
// (You can still print individual lines the same way like as above)
我正在写一个井字游戏来学习C++。
我想将游戏板存储在二维字符数组中:
char playerBoard[5][14] {
{'2',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n'},
{'1',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n'},
{'0',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n'},
{' ',' ',' ',' ','^',' ',' ',' ','^',' ',' ',' ','^','\n'},
{' ',' ',' ',' ','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];
这是怎么回事?
None 的五个数组子元素是一个以 nul
结尾的字符串(可能最后一个除外,但它依赖于未定义的行为)。
带有 char*
操作数(或 char[]
操作数,decays into a char*
)的 std::cout <<
操作假定一个以 nul
结尾的字符串;在您的情况下,由于缺少终止符,因此会打印缓冲区,直到在某处找到一个为止。这似乎是在整个数组块之后。
要解决此问题,请将子数组的大小增加到 15 个字符并添加所需的 nul
(零)终止符:
int main()
{
char playerBoard[5][15]{
{'2',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n','[=10=]'},
{'1',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n','[=10=]'},
{'0',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n','[=10=]'},
{' ',' ',' ',' ','^',' ',' ',' ','^',' ',' ',' ','^','\n','[=10=]'},
{' ',' ',' ',' ','0',' ',' ',' ','1',' ',' ',' ','2','\n','[=10=]'}
};
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)
or 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'},
{'1',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n'},
{'0',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n'},
{' ',' ',' ',' ','^',' ',' ',' ','^',' ',' ',' ','^','\n'},
{' ',' ',' ',' ','0',' ',' ',' ','1',' ',' ',' ','2','\n'},
{0}
};
// Print the whole array
std::cout << *playerBoard;
// (You can still print individual lines the same way like as above)