在 C 中打印出二维数组

Printing out 2-dimensional arrays in C

我是一名新的 CS 学生,很难理解二维数组。现在我只是想一次打印一行。

这是我的代码

#include <stdio.h>

#define N 3

int main(void)

{
    int array[N][N], i, j, rows[N], cols[N];


    for(i=0;i<N;i++)
    {
        printf("Enter row %d: ", i+1);
        for(j=0;j<N;j++)
        scanf("%d", &array[i][j]);
    }
    printf("The 5 rows you entered are: \n");
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            printf("%d", array[i][j]);
            printf("\n");
        }
    }
    printf("\n");
    return 0;
}

我想打印程序:

1 2 3
1 2 3
1 2 3

如果我添加 \n 它会打印出:

1\n
2\n
3\n
1\n
2\n
3\n
1\n
2\n
3\n

将 \n 想象成屏幕打印出来的内容,我试图表示代码打印出的内容。我无法让此框准确打印出我输入的内容。它不会让我一遍又一遍地按回车键来表示命令屏幕上的实际内容。

没有 /n 它打印出来

123123123

我也在尝试添加行和列。我设法找到了一些代码,并理解了大部分代码,除了一行。这是代码。

#include <stdio.h>

int main(void)
{
    int i, j, array[5][5], rows[5],cols[5];

    for(i=0;i<5;i++)
    {
        printf("Enter row %d: ", i+1);
        for(j=0;j<5;j++)
            scanf("%d", &array[i][j]);
    }
    **for(i=0;i<5;rows[i]=cols[i]=0,i++);**
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
        {
            rows[i]=rows[i]+array[i][j];
            cols[j]=cols[j]+array[i][j];
        }
    }
    printf("\nRow Totals:    ");
        for(i=0;i<5;i++)
    printf("%d\t", rows[i]);
    printf("\nColumn Totals: ");
    for(i=0;i<5;i++)
        printf("%d\t", cols[i]);
    printf("\n");

    return 0;
}

for(i=0;i<5;rows[i]=cols[i]=0,i++);
是行我不明白。首先,我不太理解 rows[i]=cols[i]=0,i++。其次,我不明白为什么后面有一个分号。我以为 for 语句没有使用分号,但是如果没有这一行,或者没有分号,程序就不能正常工作。当我尝试在没有这行代码的情况下使用它时,它给了我疯狂的答案,我假设是因为数组中的元素未设置为 0 而这行代码将数组的元素设置为 0。有人可以给我吗对于 C 的新手来说,另一行代码可能更容易理解?也许向我解释为什么它使用分号?

I would like to have the program print out: 1 2 3\n 1 2 3\n 1 2 3\n

做:

for(i=0;i<N;i++)
{
    for(j=0;j<N;j++)
    {
        printf("%d", array[i][j]);

    }
    printf("\n");
}


**for(i=0;i<5;rows[i]=cols[i]=0,i++);** 

肯定是语法错误。我猜你添加了 ** 来标记语句。然而,

for(i=0;i<5;rows[i]=cols[i]=0,i++);

是有效的 C 语句。一个 for 循环可以拆分为

形式
for(initilization;condition;increment)

分号 分隔 for 循环的三个部分。在你的情况下 for循环增量部分使用逗号进一步分为多个语句,如下所示。

for(initialization;condition;do something useful here, update condition variable);

代码的目的是将行和列的总和初始化为零 在实际找到总和之前。注意增量部分的逗号。它允许您添加多个语句。同样,您可以使用 逗号 进行多个初始化或多个条件。

for循环后的分号是序列点。在这里,请注意您没有 statement/compound-statement for 循环。在简单明了的语言中,分号告诉 for 循环不做 nothing。但是你在本身很聪明的for循环中间接地将行和列的总和初始化为零。

很明显,用法不是很直接。如果您不理解这些语句,我建议您阅读一本很好的 C 编程书籍。

for 循环有四个部分。您可能已经习惯了这样的循环:

for (int i = 0; i < 10; i++)
{
    printf("Hello!");
}

for (int i = 0; i < 10; i++)
    printf("Hello!");

第一部分(设置)"int i = 0" 在循环开始时运行。 第二部分(测试表达式)"i < 10" 是条件,在每次迭代之前检查,如果计算结果为 false 则结束循环。 第三部分(增量)"i++" 在每次迭代结束时运行,不进行计算。 第四部分(正文),在第二部分之后和第三部分之前。

在for循环的setup和increment部分,可以用逗号分隔多个语句。在测试表达式中使用逗号是没有意义的,因为它需要评估为 true 或 false。在正文中使用逗号也没有意义,因为您可以在那里使用分号。

没有理由不使用循环本身来为您完成工作。 在您提供的示例中:

 for(i=0;i<5;rows[i]=cols[i]=0,i++);

您已经了解循环在做什么(将 rows 和 cols 数组中的所有值设置为 0。)它只是在循环的递增部分执行,而不是在循环主体中执行。它还利用了赋值操作计算出所赋值这一事实。因此,"cols[i] = 0" 的计算结果为“0”,然后将 rows[i] 分配给该行。

但是,for 循环始终将下一条语句视为循环体。如果你想告诉循环什么都不做,那么你需要在循环之后放置一个空语句(前面没有任何内容的分号),这样它就知道什么都不做。

如果您删除分号,那么它会假设下一行是循环体,这会产生以下行为:

for(i=0;i<5;rows[i]=cols[i]=0,i++)
{
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
        {
            rows[i]=rows[i]+array[i][j];
            cols[j]=cols[j]+array[i][j];
        }
    }
}

对于您问题的实际解决方案,请使用 sjsam 的答案。

对输出逻辑的微调

printf("The %d rows you entered are: \n", N);
for(i=0;i<N;i++)
{
    for(j=0;j<N;j++)
    {
        if (j != 0)
        {
            putc(' '); /* add space if we are not the first column */
        }
        printf("%d", array[i][j]);
    }
    putc ('\n'); /* new line after each row is complete */
}
printf("\n");