我正在编写矩阵添加程序。预期的输出应该在一行上的每一行。但是在第一行输出之后,如果我使用新的行字符,它跳过一行并在第二行打印第二行。就好像我已经给出了两个新的行字符。
#include<stdio.h>
int main(int argc, char *argv[])
{
int x,y,z,w,i,j;
int a[3][3],b[3][3],c[3][3];
scanf("%d",&x);
scanf("%d",&y);
//getchar();
for(i=0;i<x;i++)
for(j=0;j<y;j++)
scanf(" %d",&a[i][j]);
scanf("%d",&z);
//getchar();
scanf("%d",&w);
//getchar();
for(i=0;i<z;i++)
for(j=0;j<w;j++)
scanf(" %d",&b[i][j]);
for(i=0;i<z;i++)
for(j=0;j<w;j++)
c[i][j]=a[i][j]+b[i][j];
for(i=0;i<x;i++){
for(j=0;j<y;j++)
printf("%d ",c[i][j]);
printf("\n");
}
}
答案 0 :(得分:0)
您的代码中存在大量未定义行为的实例。您可以防止尝试访问未初始化值的第一个位置是初始化所有变量,尤其是二维数组。这样可以防止对数组中任何未初始化的值进行无意的迭代,例如
int x,y,z,w,i,j;
int a[3][3] = {{0}}, b[3][3] = {{0}}, c[3][3] = {{0}};
x = y = z = w = 0;
接下来,在进行用户输入时,总是验证用户输入。这意味着至少验证scanf
的返回值,以确保已成功进行预期的转化次数,例如对于x
,y
数组:
/* x & y input and validation */
if (scanf (" %d", &x) != 1 || x < 0 || x > 3) {
fprintf (stderr, "error: invalid input for x '%d'.\n", x);
return 1;
}
if (scanf (" %d", &y) != 1 || y < 0 || y > 3) {
fprintf (stderr, "error: invalid input for y '%d'.\n", y);
return 1;
}
for (i = 0; i < x; i++) /* fill a -- validate input */
for (j = 0; j < y; j++)
if (scanf(" %d",&a[i][j]) != 1) {
fprintf (stderr, "error: invalid input a[%d][%d].\n",
i, j);
return 1;
}
在添加数组之间的所有索引之前,还需要验证数组a
和b
匹配的维度(其中一些索引为空且未初始化而未初始化),例如< / p>
if (x != z || w != y)
fprintf (stderr, "warning: dimension mismatch - limiting addition.\n");
在添加数组之前,必须将索引限制为仅包含值的索引。 (是否在添加后显示完整的数组取决于您)。一种方法是简单地限制数组a
和b
之间每个维度的最小索引的加法,例如(下面使用三元运算符来设置最小值)
/* add a + b -- validating max dimensions to prevent overrun */
int xdim = z > x ? x : z;
int ydim = w > y ? y : w;
for (i = 0; i < xdim; i++)
for (j = 0; j < ydim; j++)
c[i][j] = a[i][j] + b[i][j];
最后,用间距打开代码可能有助于使一些细微点更明显和可读。 (这完全取决于你 - 你得到的年龄越大,你就会越欣赏额外的间距......)把所有的部分放在一起,你可以做如下的事情:
#include<stdio.h>
int main (void) {
int x,y,z,w,i,j;
int a[3][3] = {{0}}, b[3][3] = {{0}}, c[3][3] = {{0}};
x = y = z = w = 0;
/* x & y input and validation */
if (scanf (" %d", &x) != 1 || x < 0 || x > 3) {
fprintf (stderr, "error: invalid input for x '%d'.\n", x);
return 1;
}
if (scanf (" %d", &y) != 1 || y < 0 || y > 3) {
fprintf (stderr, "error: invalid input for y '%d'.\n", y);
return 1;
}
for (i = 0; i < x; i++) /* fill a -- validate input */
for (j = 0; j < y; j++)
if (scanf(" %d",&a[i][j]) != 1) {
fprintf (stderr, "error: invalid input a[%d][%d].\n",
i, j);
return 1;
}
/* z & w input and validation */
if (scanf (" %d", &z) != 1 || z < 0 || z > 3) {
fprintf (stderr, "error: invalid input for z '%d'.\n", z);
return 1;
}
if (scanf (" %d", &w) != 1 || w < 0 || w > 3) {
fprintf (stderr, "error: invalid input for w '%d'.\n", w);
return 1;
}
for (i = 0; i < z; i++) /* fill b -- validate input */
for (j = 0; j < w; j++)
if (scanf(" %d",&b[i][j]) != 1) {
fprintf (stderr, "error: invalid input b[%d][%d].\n",
i, j);
return 1;
}
if (x != z || w != y)
fprintf (stderr, "warning: dimension mismatch - limiting addition.\n");
printf ("\n array a[%d][%d]\n\n", x, y);
for (i = 0; i < x; i++) {
for (j = 0; j < y; j++)
printf (" %3d", a[i][j]);
putchar ('\n');
}
printf ("\n array b[%d][%d]\n\n", z, w);
for (i = 0; i < z; i++) {
for (j = 0; j < w; j++)
printf (" %3d", b[i][j]);
putchar ('\n');
}
/* add a + b -- validating max dimensions to prevent overrun */
int xdim = z > x ? x : z;
int ydim = w > y ? y : w;
for (i = 0; i < xdim; i++)
for (j = 0; j < ydim; j++)
c[i][j] = a[i][j] + b[i][j];
printf ("\n array c[%d][%d]\n\n", xdim, ydim);
for (i = 0; i < xdim; i++){
for (j = 0; j < ydim; j++)
printf (" %3d", c[i][j]);
putchar ('\n');
}
putchar ('\n');
return 0;
}
(注意: main()
是类型int
的函数,因此返回值)
示例输入文件
$ cat dat/arradd.txt
3
3
1 2 3 4 5 6 7 8 9
3
3
1 2 3 4 5 6 7 8 9
示例使用/输出
$ ./bin/arrayadd <dat/arradd.txt
array a[3][3]
1 2 3
4 5 6
7 8 9
array b[3][3]
1 2 3
4 5 6
7 8 9
array c[3][3]
2 4 6
8 10 12
14 16 18
仔细看看,如果您有任何其他问题,请告诉我。