我正在尝试从文件(myfile.in)中读取一个2D数组。给出了行和列。
myfile>>n>>m; //rows and cols
for(int i = 0; i < n; i++) {
for(int j =0; j < m; j++) {
myfile>>tab[i][j];
cout<<tab[i][j]<<" ";
}
cout<<endl;
}
并且屏幕上的输出应该是(因为它在文件中):
1 0 0 0 1 0 1
0 1 1 1 1 0 0
0 0 1 0 1 1 0
0 1 0 0 1 0 0
0 1 0 0 0 1 1
1 1 1 1 0 0 0
0 1 0 0 0 1 1
之后我试图分别打印阵列。
for(int i = 0; i < n; i++) {
for(int j =0; j < m; j++) {
cout<<tab[i][j]<<" ";
}
cout<<endl;
}
,输出为:
0 1 0 0 0 1 1
0 1 0 0 0 1 1
0 1 0 0 0 1 1
0 1 0 0 0 1 1
0 1 0 0 0 1 1
0 1 0 0 0 1 1
0 1 0 0 0 1 1
实际上它显示的是最后一行,为什么?
答案 0 :(得分:2)
根据您的评论,您实际上是将标签初始化为tab[0][0]
。我不知道编译器是怎么允许的,但重要的是你在数组边界外写字,触发undefined behavior 。
尝试在n和m中读取之后动态分配数组:
int n, m;
file >> n >> m;
int **tab = new int* [n];
for(size_t i = 0; i < n; ++i)
{
tab[i] = new int[m];
}
这样你就可以确保只分配你需要的内存。
另外,完成后不要忘记删除数组:
for(size_t i = 0; i < n; ++i) delete[] tab[i];
delete[] tab;
正如您所看到的,这种方法往往会增加太多不必要的复杂性。优雅的替代方案是使用容器,例如std::vector<std::vector<int>>
:
using namespace std;
vector<vector<int>> tab;
for(int i = 0; i < n; ++i) {
vector<int> current_row;
for(int j = 0; j < m; ++j) {
int buff;
file >> buff;
current_row.push_back(buff);
}
tab.push_back(current_row);
}
答案 1 :(得分:1)
int n=0, m=0; int tab[n][m];
这不是合法的C ++,原因有两个:
数组的维度必须是常量表达式。 n
和m
不是。
您正在创建一个0大小的数组。
如果存在常量表达式(5.19),则其值应大于零。
您的编译器正在接受它,因为它具有接受这两者的扩展。尽管如此,您的数组大小为0,因此它没有元素。你试图写入它的任何东西都将超出数组的范围。
阅读myfile>>n>>m;
不会自动更改数组的大小。你已经宣布它的大小为0.你所做的一切都不会改变它。
相反,您最好使用标准库容器,例如std::vector
,它可以在运行时更改大小。考虑:
myfile >> n >> m;
std::vector<std::vector<int>> tab(n, std::vector<int>(m));
然后,您可以使用此tab
对象,方法与上面完全相同。