【问题标题】:Read matrix element and respective row and column indexes from text file from text file in C从 C 中的文本文件中读取矩阵元素以及相应的行和列索引
【发布时间】:2021-04-05 22:45:14
【问题描述】:

我正在尝试在 C 中进行捕食者 - 猎物模拟,但我对 C 编程非常陌生。 我似乎无法按预期填满董事会。

我需要从作为程序标准输入的文本文件中读取模拟的输入参数。 输入文件有以下数据:

2 4 3 6 5 5 9

摇滚0 0

兔子 0 2

福克斯 0 4

福克斯 1 0

福克斯 1 4

摇滚 2 4

兔子 3 0

兔子 4 0

福克斯 4 4

最初,我阅读了第一行,其中包含一组模拟所需的参数。 我可以很好地阅读这些内容,然后使用这些值。

然后,我需要阅读以下 9 行,其中包含代表我的板的矩阵中的对象以及相应的 x 和 y 位置。 我应该得到这样的东西作为初始状态:

enter image description here

其中 * 代表岩石,R 代表兔子,F 代表狐狸。 这是我到目前为止所做的:

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

// Declare functions
void *fillMatrix(int nobj, int r, int c);
void printMatrix(char *_matrix, int r, int col);

int main(int argc, char *argv[]) {
    
    int GEN_PROC_RABBITS, // number of generations until a rabbit can procreate
    GEN_PROC_FOXES, //  number of generations until a fox can procreate
    GEN_FOOD_FOXES, // number of generations for a fox to die of starvation
    N_GEN, // total number of generations for the simulation
    ROWS,
    COLS,
    N; // inicial number of objects in the ecosystem

if (!scanf("%d %d %d %d %d %d %d", &GEN_PROC_RABBITS, &GEN_PROC_FOXES, &GEN_FOOD_FOXES, &N_GEN, &ROWS, &COLS, &N)) {
    fprintf(stderr, "Error while reading input.\nAborting...\n");
    exit(-1);
    }

char *matrix;
    matrix=fillMatrix(N,ROWS,COLS);
    printMatrix(matrix, ROWS, COLS);

void *fillMatrix(int nobj, int r, int c){
    char (*matrix)[c] = (char (*)[c]) malloc(r * c * sizeof(char));
    char *character[6];
    int m;
    for (m=0; m < nobj; m++) {
        scanf("%s %d %d", &character, &r, &c);
        printf("%s %d %d\n", character, r, c);
        matrix[r][c] = character[0];   
    }
    return (char *) matrix;
}

void printMatrix(char *_matrix, int r, int c){
    char (*matrix)[c] = (char (*)[c]) _matrix;
    int i, j;
    printf("Gen 0\n");
    printf ("--------\n");
    for(i=0; i < r; i++) {
        for (j=0; j < c-1; j++) {
            printf("%c ", matrix[i][j]);
        }
        printf("%c\n", matrix[i][j]);
    }
    printf ("--------\n");
    fflush(stdout);
}

我得到的是这样的:

enter image description here

另外,我仍然需要将 ROCKS 中的 R 替换为“*”,当我尝试这样做时,一切都变得更加混乱。 似乎内存分配有问题,或者我遗漏了其他东西。

有人可以帮助我在这里做错什么吗?非常感谢。此外,非常欢迎任何关于更好方法的建议。

【问题讨论】:

    标签: c matrix simulation dynamic-memory-allocation


    【解决方案1】:

    您可以尝试像这样声明您的矩阵:

    void *fillMatrix(int nobj, int r, int c)
    {
        char (*matrix)[r][c] = malloc(sizeof(*matrix));
    
        // Fill the whole matrix with empty space characters
        // When declared this way, 'matrix' must be dereferenced each time it's used
        memset(*matrix, ' ', sizeof(*matrix));
    
        char *character[6];
        int m;
        for (m=0; m < nobj; m++) {
            scanf("%s %d %d", &character, &r, &c);
            printf("%s %d %d\n", character, r, c);
            (*matrix)[r][c] = character[0]; //<== (*matrix)   
        }
        return (char *) matrix;
    }
    
    void printMatrix(char *_matrix, int r, int c)
    {
        // Idem here
        char (*matrix)[r][c] = (char (*)[r][c]) _matrix;
        int i, j;
        printf("Gen 0\n");
        printf ("--------\n");
        for(i=0; i < r; i++) {
            for (j=0; j < c-1; j++) {
                printf("%c ", (*matrix)[i][j]); //<== (*matrix)
            }
            printf("%c\n", (*matrix)[i][j]); //<== (*matrix)
        }
        printf ("--------\n");
        fflush(stdout);
    }
            printf ("--------\n");
            fflush(stdout);
        }
    

    【讨论】:

    • 这解决了我的问题。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多