输出是整个行/列的数字字符串,而不是单个数字。有人可以帮我吗?
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
int t;
cin>>t;
while(t--){
int n,m,cnt=0;
cin>>n>>m;
for(int i=0;i<=n+1;i++){
for(int j=0;j<=m+1;j++){
if(i==0||i==n+1||j==m+1||j==0) G[i][j]=0;
cin>>G[i][j];
}
}
cout<<G[1][2]<<endl;//this gives wrong o/p
返回0; }
答案 0 :(得分:2)
由于i <= n + 1
循环中的j <= m + 1
和for
条件导致i < n
因此调用undefined behavior导致堆栈损坏,导致输出解释,因此您很可能正在读取界限你看到了。将边界修改为:
j < m
和somearray[0]
。数组在C ++中为零索引。第一个数组元素是通过somearray[n-1]
访问的,最后一个元素是somearray[n]
而不是cout << G[i][j] << endl;
,这是您尝试在代码中访问的内容。多维数组也是如此。声明:
for
错误地放在for
循环之外。它应该在内部while
循环内。应该将数组定义为int G[n][m]; // Avoid VLAs
循环中的第二个语句:
std::vector
这就是说可变长度数组不是C ++标准的一部分,你应该更喜欢std::array
和org.h2.jdbcx.JdbcDataServer
到原始数组。
答案 1 :(得分:2)
假设G
是一个大小为n x m
的二维数组,那么你就会超出界限:
for(int i=0;i<=n+1;i++) {
for(int j=0;j<=m+1;j++)
因为数组索引从0开始,并以size-1结束。
因此,您的代码会调用未定义的行为。为避免这种情况,只需将double for循环更改为:
for(int i = 0; i < n; i++) {
for(int j = 0;j < m; j++)