为什么 2-D 阵列在不应该打印的地方打印 1?

Why the 2-D array prints 1 where it should not?

本文关键字:打印 方打印 阵列 2-D 不应该 为什么      更新时间:2023-10-16

我的代码在除第一列以外的每个位置打印 1。我希望它在某些特定位置(r,c)打印1,其中r是行,c是列。另外,谁能告诉我如何在每个索引处用 0 初始化 2-D 数组?

我试图将 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

一些评论:首先,C-Style Array 的大小必须在编译时知道标准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,因为它也会刷新缓冲区,这在写入文件时可以 具有严重的性能影响(对于控制台输出,这没有问题)。最好使用""作为换行符,如果需要,则显式使用 std::flush。

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

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: ";,但这是我的测试运行,因为您可以看到除了我指定的元素之外,所有元素均为零:

$ ./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

事实并非如此,因此是虚假信息。

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

您正在这样做:

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

当输入为"1 4"时,这将调用未定义行为 (UB),因为您超出了范围,因为您拥有的 2D 数组是 4x4 维的,因此您需要执行以下操作:

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

因为数组的索引为零。我把 2 改成了 1,因为这是你要求的。

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

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