矩阵添加程序。如果我输入一个换行符,它就会跳过一行。然后进入第三行

时间:2016-07-20 18:42:31

标签: c

我正在编写矩阵添加程序。预期的输出应该在一行上的每一行。但是在第一行输出之后,如果我使用新的行字符,它跳过一行并在第二行打印第二行。就好像我已经给出了两个新的行字符。

#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");
    }
}

output

1 个答案:

答案 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的返回值,以确保已成功进行预期的转化次数,例如对于xy数组:

    /* 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;
            }

在添加数组之间的所有索引之前,还需要验证数组ab匹配的维度(其中一些索引为空且未初始化而未初始化),例如< / p>

    if (x != z || w != y)
        fprintf (stderr, "warning: dimension mismatch - limiting addition.\n");

在添加数组之前,必须将索引限制为仅包含值的索引。 (是否在添加后显示完整的数组取决于您)。一种方法是简单地限制数组ab之间每个维度的最小索引的加法,例如(下面使用三元运算符来设置最小值)

     /* 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

仔细看看,如果您有任何其他问题,请告诉我。