【问题标题】:2d C array isn't printing or is creating incorrectly2d C 数组未打印或创建不正确
【发布时间】:2021-10-04 02:05:56
【问题描述】:

我写了一段 c 代码来创建一个二维数组,然后打印它。但是它没有打印出来,我可以看到每个循环似乎都在正确的时间运行。

我对 c 很陌生,所以这个答案可能真的很基本抱歉。

我的代码编译得很好(gcc),但没有返回我所期望的。我在 WSL 中使用 ubuntu 18.04 和 gcc 作为我的编译器。

这是我的代码:


#include <stdio.h>

int main(void) {
    int i, k;

    int array[2][3] = {0};

    for (i = 0; i < 2; i++) {
        printf("l1 ");
        for (k = 0; k < 3; k++) {
            scanf("%d", &array[i][k]);
            printf("l2 ");
        }
    }

    for (int i = 0; i < 3; ++i) {
        printf("l3 ");
        printf("%d ",  array[k][i]);

        if(i == 2) {
                i = -1;
                ++k;
                printf("\n");
        }
        if(k == 3) {
                printf("yay");
                return 0;
        }
    }
}

终端窗口如下所示:

l1 1
l2 2
l2 3
l2 l1 4
l2 5
l2 6
l2 l3 32602 yay

数字是我输入的元素,除了最后一个似乎作为输出出现的元素,但它与我期望的完全不同。

我希望它打印我所有的数组元素,但我不明白为什么它不打印,因为我在 gcc 中没有收到错误,所以我的语法看起来不错。

谢谢。

【问题讨论】:

  • "所以我的语法看起来不错。"语法错误只是最简单的错误。您的编译器甚至会告诉您有关它们的信息。所有其他错误都更难找到。
  • 一般提示:对于这样的小程序,第一步是在调试器中运行它,并在观察所涉及的变量的同时逐步执行您的指令。这应该会立即向您显示您在第二个循环中的位置以及 k 的值。
  • 我喜欢这种方法,但我认为它使任务过于复杂,首先正如@Gerhardh 指出的那样,您在第二个循环结束后立即重用k,您应该再考虑一下想想k 的价值可能是多少。我会尝试使用最直观的解决方案来解决问题,这样我就不必处理这些细微差别!
  • @Newbie 你不需要告诉我们没有语法错误,因为如果有语法错误你会告诉我们编译器的错误日志,不是吗?
  • @Newbie 学习的好机会,肯定有很多教程

标签: arrays c gcc ubuntu-18.04 windows-subsystem-for-linux


【解决方案1】:

我建议你安装 ddd(一个显示调试器,内部默认使用 gdb)。做

sudo apt install ddd

现在开始

gcc -g test.c

现在你得到了 a.out。 (如果您执行gcc -g test.c -o test,您将获得test 作为可执行文件)

并运行调试器。

ddd a.out

现在您将看到源代码窗口和命令窗口。在命令窗口中,键入 b main(在 main 处中断)。 a.out 在 main 处运行并停止。 (你知道在 main 之前有东西在运行。)按 'n' 下一个(运行到下一行),进入函数按s(步入),从内部完成一个函数,按f,运行到第 100 行,u 100 等。搜索 gdb 命令。要在单独的图形窗口中显示变量,请执行graph disp i。要在第 100 行设置中断,b 100,如果 j == 3,则在第 100 行设置中断,b 100 if j == 3。要打印一个值 i,p i,有 watch 命令(你运行它,当被监视的值改变时,它会停止)。等等
我不知道您要做什么,但是您没有忘记两个大 for 循环之间的 settkgin k=0 吗?无论如何,您可以进行调试并找出错误所在。 添加:如果你想使用普通的 gdb,在输入 layout src 之后,你就会得到源代码。除图形显示外,其余命令相同。

【讨论】:

    【解决方案2】:
        int i, k;
    
        int array[2][3] = {0};
    
        for (i = 0; i < 2; i++) {
            printf("l1 ");
            for (k = 0; k < 3; k++) {
                scanf("%d", &array[i][k]);
                printf("l2 ");
            }
        }
    

    考虑这个循环,它会在完成后将 'k' 留在 k=3,然后如果你这样做:

        for (int i = 0; i < 3; ++i) {
            printf("l3 ");
            printf("%d ",  array[k][i]); // exactly here
    
            if(i == 2) {
                    i = -1;
                    ++k;
                    printf("\n");
            }
            if(k == 3) {
                    printf("yay");
                    return 0;
            }
        }
    

    您将尝试访问超出范围的 arr[3][0],这就是打印 32602 的原因, 随着 k=3 和(仍然)i=0 的进一步发展,您将进入 if(k==3) 条件,该条件打印 yay,返回 0 并结束该过程。

    【讨论】:

    • 但是在两个循环之间添加 k=0 并不能解决问题,因为你会不断增加这个 k 到数字 3 直到循环停止,它仍然会尝试打印 array[ 2][x]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 2012-10-16
    • 1970-01-01
    相关资源
    最近更新 更多