#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

void getGrades(FILE *ifp, int assigns, int stus, int grades[assigns][stus]);
void printGrades(int assigns, int stus, int grades[assigns][stus]);

int main(int argc, char *argv[])
{

    int assigns = 0;
    int stus = 0;
    int grades[assigns][stus];

    // command line arg. error checking
    if (argc != 2)
    {
        printf("Syntax Error: ./<exec> <file>\n");
        exit(1);
    }
    // file handle = open("infile.txt", read)
    FILE *ifp = fopen(argv[1], "r");
    if (ifp == NULL){
        printf("Could not open %s for reading!\n", argv[1]);
        exit(1);
    }
    fscanf(ifp, "%d%d", &assigns, &stus); // it does scan in 8 and 5 correctly
    // print debugging check
    // printf("assigns == %d\nstus == %d", assigns, stus);

    getGrades(ifp, assigns, stus, grades);
    printGrades(assigns, stus, grades);
    return 0;
}

void getGrades(FILE *ifp, int assigns, int stus, int grades[assigns][stus])
{
    int i = 0, j = 0;
    // iterate through all of the rows & columns
    for (i = 0; i < assigns; ++i){
        for (j = 0; i < stus; ++j){
           fscanf(ifp, "%d", &grades[i][j]);
        }
    }
}

void printGrades(int assigns, int stus, int grades[assigns][stus])
{
    int i = 0, j = 0;
    for (i = 0; i < assigns; ++i){
        for (j = 0; j < stus; ++j){
            printf("%10d", grades[i][j]);
        }
        printf("\n");
    }
}

输入文件如下所示:

8. 5. 100 92 84 76 68 99 91 83 75 67 98 90 82 74 66 97 89 81 73 65 96 88 8072 64 95 87 79 71 63 94 86 78 70 62 93 85 77 69 0

我只是希望输出如下所示

   100        92        84        76        68
    99        91        83        75        67
    98        90        82        74        66
    97        89        81        73        65
    96        88        80        72        64
    95        87        79        71        63
    94        86        78        70        62
    93        85        77        69         0

我不知道我的程序不打印输出的代码中哪里出错了.

由于输入文件中的行和列可以更改,因此大小是动态的.现在,输入文件中的行是8,列是5.

推荐答案

您的代码的问题是:

    int assigns = 0;
    int stus = 0;
    int grades[assigns][stus];

这个数组的大小是多少?稍后,您更改了值assignsstus,但此时数组已经创建.

您应该仅在具有assignsstus的值之后创建array.如果将其下移到读取这些值的fscanf之后,则会起作用:https://onlinegdb.com/UIWe4ZZh5

C++相关问答推荐

rSP堆栈指针在返回函数调用的值时有任何用途吗?

单指针和空参数列表之间的函数指针兼容性

如何在Visual Studio代码中关闭此函数名称显示功能?

在 struct 中强制转换空指针

在循环中复制与删除相同条件代码的性能

理解C版宏(看起来像未声明的变量?)

从TCP连接启动UDP(C套接字)

Boyer Moore算法的简单版本中的未定义行为

如何在双向表中实现线程安全,每个条目仅使用4位,同时避免任何全局锁?

C:如何将此代码转换为与数组一起使用?

为什么我在C代码中得到一个不完整的类型?

我可以创建适用于不同endian的 colored颜色 struct 吗?

问题:C#Define上的初始值设定项元素不是常量

当我将偏移量更改为任何非零值时,C中的mmap共享内存出现无效参数错误

生成的头文件不包括用户定义的文件

当另一个指向 const 的指针观察到数据时,通过指针更改数据是否安全?

我正在使用 klib 库 我可以使用 (khash) KHASH_SET_INIT_INT64() 负值作为键.因为我在头文件中看到它使用 unsigned long int

GDB 跳过动态加载器代码

如何向 execl 创建的后台程序提供输入?

这种 C 函数风格的名称是什么?