我遇到这个问题的一个小问题,我真的可以使用另一组眼睛。我基本上试图读取我输入的矩阵然后显示所述矩阵。
程序总是返回一个空矩阵(所有位置都为0)。矩阵的大小(列/行)很好。我做错了什么?
#include <stdio.h>
#include <stdlib.h>
#define MAXN 10
void display_matrix(int n, int m, double a[MAXN][MAXN], char ch)
{
int i, j;
printf("\n MATRIX %c\n", ch);
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++) printf("%8.2lf ",a[i][j]);
printf("\n");
}
}
void read_matrix(int *n, int *m, double a[MAXN][MAXN])
{
int i,j;
printf("\nInput of size and elements of a matrix\n");
printf("\n\tNumber of rows, n=");
scanf("%d", n);
printf("\n\tNumber of columns, m=");
scanf("%d", m);
printf("\n\tThe elements of the matrix\n");
for (i = 0; i < *n; i++)
{
for(j = 0; j < *m; j++)
{
printf("a[%d,%d]=", i, j);
scanf("%lf",&a[i][j]);
}
}
printf("\n");
}
void main()
{
int n, m;
double a[MAXN][MAXN];
read_matrix(&n, &m, a);
display_matrix(n, m, a, 'X');
return 0;
}
答案 0 :(得分:2)
您的代码看起来很好(main()
的返回类型应为int
,您应该始终检查scanf()
的返回值,除了以下行: / p>
printf("%8.2lf ",a[i][j]);
在C99标准之前,l
修饰符未与f
转换说明符一起定义。结合使用这两个导致未定义的行为。我不知道可能性是多少,但是你有一个行为不当或实现%lf
的前C99 C库来匹配完全不同的东西,可能是long double
,这是不可想象的。
要打印双精度数,您应该使用%f
转换说明符:
printf("%8.2f ",a[i][j]);
这只是抓着稻草。它可能对你没有任何改变。
scanf()
函数对float
(%f
)和double
(%lf
)有不同的转换说明符,因为它需要知道确切的类型相应的指针参数指向。
但是当您将float
传递给可变参数函数(例如printf()
)时,默认参数提升会将float
转换为double
}。因此,printf()
函数不需要float
的转换说明符,因为无法将float
传递给它。 C99标准添加了l
修饰符,仅用于scanf()
函数的对称性。