为什么 2-D 阵列在不应该打印的地方打印 1?
Why the 2-D array prints 1 where it should not?
我的代码在除第一列以外的每个位置打印 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 41 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 的值重置为零,但没有任何变化。
这没有实际效果,因为r
和c
将在下次输入时被覆盖。
- 如何循环打印顶点结构
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 如何在c++中打印目录
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 在线编译器中的分段C++没有打印消息
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 如何将结构插入到集合中并打印集合的成员
- 如何使用重新定义的打印函数打印Lua表?
- 在 POS 打印机上打印条形码字体
- 是否可以调试打印当前函数的调用方
- 视觉打印没有打印任何输出内容?C++ SDL
- 打印,打印到MAC OS X上
- 为类打印输出(打印调试信息)的最佳实践是什么?
- QWebView不在实际打印机上打印多页
- 有没有办法创建一个公共输出流对象以在控制台上打印并打印到 c++ 中的文件
- 防止在打印C++打印中打印标志
- <string> 当我得到一个'compilr.com/rayd360/test-songst'时如何打印出打印矢量
- 在打印机上打印(windows平台32位)
- 流可以用来在打印机上打印