为什么二维数组在不应该打印的地方打印1?

时间:2019-04-07 12:07:28

标签: c++ arrays

我的代码在除第一列之外的所有位置都打印1。我希望它在某些特定位置(r,c)打印1,其中r是行,c是列。另外,有人可以告诉我如何在每个索引处将0初始化为二维数组吗?

我试图将r和c的值重置为零,但没有任何变化。

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        vector <long long int>R;
        vector <long long int>C;
        long long int N, M, K, r, c, i, j, k; // N -> rows, M -> columns
        cin>>N>>M>>K;
        long long int arr[N][M];
        cout<<K<<endl;
        for(i=0; i<N; i++)
        {
            for(j=0; j<M; j++)
            {
                arr[i][j] = 0;
            }
        }
        for(k=0; k<K; k++)
        {
            cin>>r>>c;
            arr[r][c] = 2;
            r = 0; c = 0;
        }

        for(i=0; i<N; i++)
        {
            for(j=0; j<M; j++)
            {
                cout<<arr[i][j]<<" ";
            }
            cout<<endl;
        }
    }
    return 0;
}

输入:

  

1 4 4 9 1 4 2 1 2 2 2 3 3 1 3 3 4 1 4 2 4 3

2 个答案:

答案 0 :(得分:3)

一些评论: 首先,对于标准C ++,必须在编译时就知道C样式数组的大小,因此您不能从cin(这是GCC扩展名)中读取它们。 因此,如果您需要一个仅在运行时知道大小的数组,则建议使用std :: vector。

此外,在C ++中,通常的做法是在for循环范围内定义循环变量,如下所示:

for (int i = 0; i < N ++i)

这可以使周围的示波器保持清洁。可以使用以下统一初始化语法在C ++中将数组或结构初始化为零:

SomeStruct x{}; // All members are default initialized (e. g. for built-in types: 0)
SomeType myArray[N][M]{}; // All elements are default initialized

像这样的评论 // N -> rows, M -> columns 只是在说您应该将变量命名为行/列,而不是N / M。使您的代码具有自我说明性;)

我不建议在需要换行时使用std :: endl,因为它还会刷新缓冲区,这在写入文件时可能 对性能有严重影响(对于控制台输出,这没有问题)。更好的做法是使用'\ n'作为换行符,并在需要时显式使用std :: flush。

为了简单起见,我省略了外部的while循环,并使Rows / Columns保持不变。使用std :: vector时,应将Rows * Cols作为大小 一维数组,然后使用以下公式将位置(i,j)映射到一维索引:

arr2D[i][j] = arr1D[i*Cols + j]; 如果您选择让用户指定行/列并使用

std::vector<int> vec(rows*cols);

作为数组。

int main()
{
    constexpr int rows{3};
    constexpr int cols{3};
    int numUserValues{};
    cin >> numUserValues;
    int arr[rows][cols]{};
    cout << numUserValues << '\n';

    for(int k=0; k<numUserValues; k++)
    {
        int r{};
        int c{};
        if (cin>>r>>c && r>=0 && r<rows && c>=0 && c<cols) {
            arr[r][c] = 2;
        }
    }

    for(int i=0; i<N; i++)
    {
        for(int j=0; j<M; j++)
        {
            cout<<arr[i][j]<<" ";
        }
        cout<<'\n';
    }
    return 0;
}

您的程序非常不友好,因为您根本没有任何提示(例如cout << "Enter number of rows: ";,但这是我的测试运行,因为您可以看到除我指定的元素外所有元素均为零:< / p>

$ ./test
5
5
0 0
1 1
2 2
0 1
0 2
2 2 2
0 2 0
0 0 2

您的问题很难回答,因为您说“我想在位置...上打印1” ,而您的代码说arr[r][c] = 2;;)

“我的代码在除第一列之外的所有位置都打印1” ,表示5x5:

0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1

这不是事实,因此是虚假信息。

答案 1 :(得分:1)

  

我希望它在某些特定位置(r,c)打印1,其中r是行,c是列

您正在这样做:

cin>>r>>c;
arr[r][c] = 2;

当输入为“ 1 4”时,它会调用未定义行为(UB),因为超出范围,因为您拥有的2D数组的尺寸为4x4,所以您需要执行以下操作:< / p>

arr[r - 1][c - 1] = 1;

因为数组的索引为零。我将2更改为1,因为这就是您要的。

  

我试图将r和c的值重置为零,但没有任何变化。

这没有实际效果,因为rc在下一次输入时将被覆盖。