关于用scanf循环输入二维数组的有关问题
关于用scanf循环输入二维数组的问题
题目是百炼网上的一个程序题,上边的输入要求先输入一个数组的行和列,然后在输入数组的值(先输入一行,中间空格隔开,当前行输入后回车输入下一行),认为输入正确,不考虑错误情况。
下面是程序代码
#include <stdio.h>
#include <stdlib.h>
typedef struct A
{
int data;
}data;
int main()
{
int h,l,i,j;
scanf("%d %d",&h,&l);
data** a=(data**)malloc(sizeof(int)*h*l);
for(i=0;i<h*l;i++)
*(a+i)=(data*)malloc(sizeof(data));
for(i=0;i<h;i++)
for(j=0;j<l;j++)
scanf("%d",&((*(a+i*h+j))->data));
for(i=0;i<h;i++)
{
for(j=0;j<l;j++)
printf("%d(%d,%d) ",(*(a+i*h+j))->data,i,j);
printf("\n");
}
return 0;
}
这个程序测试了下,结果很奇怪,如果数组行和列相等的话,不会出问题,如果数组行>列的话会出现段错误,行<列的话,就会出现每行的最后一个数没有输入的情况。下面是运行情况

先输入一个6*6的矩阵,结果正确,
再输入一个2*3的矩阵,(0,2)处的值本来应为1,结果为0(实际上(0,2)和(1,0)的值始终相等,可用其他值测试),
输入3*2的矩阵就段错误了。
这个到底是怎么回事??
------解决方案--------------------
题目是百炼网上的一个程序题,上边的输入要求先输入一个数组的行和列,然后在输入数组的值(先输入一行,中间空格隔开,当前行输入后回车输入下一行),认为输入正确,不考虑错误情况。
下面是程序代码
#include <stdio.h>
#include <stdlib.h>
typedef struct A
{
int data;
}data;
int main()
{
int h,l,i,j;
scanf("%d %d",&h,&l);
data** a=(data**)malloc(sizeof(int)*h*l);
for(i=0;i<h*l;i++)
*(a+i)=(data*)malloc(sizeof(data));
for(i=0;i<h;i++)
for(j=0;j<l;j++)
scanf("%d",&((*(a+i*h+j))->data));
for(i=0;i<h;i++)
{
for(j=0;j<l;j++)
printf("%d(%d,%d) ",(*(a+i*h+j))->data,i,j);
printf("\n");
}
return 0;
}
这个程序测试了下,结果很奇怪,如果数组行和列相等的话,不会出问题,如果数组行>列的话会出现段错误,行<列的话,就会出现每行的最后一个数没有输入的情况。下面是运行情况
先输入一个6*6的矩阵,结果正确,
再输入一个2*3的矩阵,(0,2)处的值本来应为1,结果为0(实际上(0,2)和(1,0)的值始终相等,可用其他值测试),
输入3*2的矩阵就段错误了。
这个到底是怎么回事??
scanf问题
------解决方案--------------------
#include <stdio.h>
#include <stdlib.h>
typedef struct A
{
int data;
}data;
int main()
{
int h,l,i,j;
scanf("%d %d",&h,&l);
data** a=(data**)malloc(sizeof(data*)*h*l);
for(i=0;i<h*l;i++)
*(a+i)=(data*)malloc(sizeof(data));
for(i=0;i<h;i++)
for(j=0;j<l;j++)
scanf("%d",&((*(a+i*l+j))->data));//应该是a+i*l+j。。。
for(i=0;i<h;i++)
{
for(j=0;j<l;j++)
printf("%d(%d,%d) ",(*(a+i*l+j))->data,i,j);//这里也是。。
printf("\n");
}
return 0;
}