在N中存储N ^(n * n)矩阵

时间:2016-04-28 06:44:13

标签: c arrays matrix multidimensional-array

每当我在工作中找到一个很好的解决问题的方法时,总是开始用C编码来破坏那种感觉......:D

所以我在这里,用一些简单的C代码进行操作,并想知道为什么它没有工作o.O 我想用二维数组(数组数组)表示一个矩阵,并从文本文件中填充它。代码很糟糕,代码丑陋...我对任何提示/技巧都感兴趣,高级先生:)

我的逻辑有什么问题?引擎盖下是什么?我是否按预期使用[]运算符?我只是不知道如何迭代2D数组?我使用for()中的声明在cl上使用声明来编译这个源代码,并且上帝知道还有什么不是严格的C类。

输入是一个文本文件,包含矩阵的大小和由空格分隔的元素。语法:file:= {n,A | n:-N,A:= N ^(n * n)}

例如:

3
1 3 2
4 5 2
7 0 1

所以这是......掩护!

#include <stdio.h>

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

打开文件,没有错误检查最小代码:)

    FILE *fp = fopen("mat_mul.test", "r");

现在,根据文件中的第一个整数分配数组......这是正确的吗?有没有更好的方法来分配数组?

    int n = fgetc(fp) - '0';
    int **A = (int**) malloc(sizeof(int*) * n);
    for (int i = 0; i < n; i++)
        A[i] = (int*) malloc(sizeof(int) * n);

Aaand,这是魔法,这个咒语反对它的主人:D

    char act;
    int i = 0, j = 0;
    while (EOF != (act = fgetc(fp)))
        if ('0' <= act && '9' >= act)
            A[j == n - 1 ? i++ : i][j == n - 1 ? j = 0 : j++] = act - '0';

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("A[%i][%i]=%i\n", i, j, A[i][j]);
        }
    }

清洁无需详尽!

    if (fclose(fp)) {

    return 0;
}

1 个答案:

答案 0 :(得分:1)

当您尝试在此处立即执行行和列分配以及进度时,您将调用未定义的行为:

A[j == n - 1 ? i++ : i][j == n - 1 ? j = 0 : j++] = act - '0';

您在第二对括号中分配给j,并在第一对中访问其值。 (我的编译器警告我,&#34; j&#39;操作可能未定义&#34;。)三元操作符的各部分之间有一个序列点,但两个索引操作符之间没有序列点{ {1}}。

除了未定义的行为之外,我认为表达式也不必要地复杂化。单独指定分配并推进行和列计数器:

[]

您还应该在 if ('0' <= act && '9' >= act) { A[i][j] = act - '0'; j++; if (j == n) { j = 0; i++; if (i == n) break; // end outer while } } 的声明中加入<stdlib.h>。 (这也是我的编译器在启用警告时告诉我的东西。)