错误打印2D字符数组

时间:2019-01-21 16:12:47

标签: c++

我正在做作业,我声明了一个2D数组,但是它没有打印我想要的东西。

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    char NOTE[7][3] = { {'D','O'} , {'R','E'} , {'M','I'} , {'F','A'} , {'S','O','L'} , {'L','A'} , {'S','I'} };

    for (int i = 0; i <7 ; i++)
        cout <<setw(10)<< NOTE[i] << "\n";

    return 0;
}

我想得到:

DO
RE
MI
FA
SOL
LA
SI
DO

但是我得到了:

DO
RE
MI
FA
SOLLA
LA
SI
DO

1 个答案:

答案 0 :(得分:2)

NOTE[i]是一个字符数组。 << NOTE[i]将此数组插入字符流。数组参数衰减为指向第一个字符的指针。

文档说行为是不确定的,除非指针操作数指向以null结尾的数组。数组{'S','O','L'}的结尾不是null。因此,程序的行为是不确定的-尽管可以辩称应该很好地定义多维数组的边界子数组的迭代行为(程序中显示了行为),但是对标准的严格解释是就是UB。

因此,要获得所需的输出,您需要1.将每个子数组null终止(因此需要一个更大的数组),或者2.分别打印每个字符。