0

我被要求:

创建一个 ANSI C 程序,该程序将读取包含字符“x”或空格的 25 x 25 矩阵的文本文件。

Display the initial generation using the function printf.

Calculate the next generation using the rules mentioned above and save it in another textfile.

The filenames of the input and output textfiles should be specified as command-line parameters.

到目前为止,我所拥有的只是一个要求文本文件的代码,然后我的代码将其打印出来。我缺乏应用康威生命游戏规则的代码。我不知道该放在哪里。以及使用什么代码。:( 请帮我。

这是我现在拥有的:

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

#define MAX_LINE_LEN 80
#define N 25

void display(char [][N+1], size_t);

int main(int argc, char *argv[]) {
  FILE *fp;
  char in[MAX_LINE_LEN];
  char grid[N][N+1] = { { '\0' } };
  size_t i = 0;

  printf("Enter filename: ");
  fgets(in, MAX_LINE_LEN, stdin);
  *(strchr(in, '\n')) = '\0';
  if ((fp = fopen(in, "r")) != NULL) {
    while ((i < N) && (fgets(in, MAX_LINE_LEN, fp) != NULL)) {
      *(strchr(in, '\n')) = '\0';
      /* should verify only 'x' and space in string before storing */
      strncpy(grid[i++], in, N);
    }
    /* pad each row with spaces, if necessary, for NxN array */
    for (i = 0; i < N; i++) {
      while (strlen(grid[i]) < N) {
        strcat(grid[i], " ");
      }
    }
    /* For all generations ...
            compute next generation */
            display(grid, N);
    /* End for all generations */
  } else {
    printf("%s not found.\n", in);
    getch();
  }
  getch();
}

void display(char a[][N+1], size_t n) {
    size_t i;
    for (i = 0; i < n; puts(a[i++]));
}
4

1 回答 1

3
*(strchr(in, '\n')) = '\0'; 

坏朱朱。如果strchr返回 NULL,则会出现段错误。我知道你的数据总会有一个换行符,但这是一个坏习惯。 始终将结果分配给strchr变量并首先执行 NULL 检查:

char *tmp = strchr(in, '\n');
if (tmp)
  *tmp = 0;

坦率地说,我认为把你的网格当作一个字符串数组会导致比它解决的更多的悲伤。像对待任何其他类型的二维数组一样对待它。无论您做什么,处理输入文件中每一行末尾的换行符都会很痛苦。

至于如何构建代码,请从高层次考虑问题:

  1. 您需要加载一个文件作为起始网格;
  2. 你需要为下一代计算网格,对于一些代数;
  3. 您需要显示每个网格;
  4. 您需要将每个网格写入文件。

您已经将显示代码拆分为自己的函数;您只需要对加载、计算和编写函数执行相同的操作(您可以将文件加载代码保留在 中main,但如果将其放入自己的函数中,代码会更简洁)。

void load(const char *filename, char (*grid)[N], size_t rows) {...}
void calc(char (*grid)[N], size_t rows) {...}
void save(const char *filename, char (*grid)[N], size_t rows) {...}

因此,每次通过 in main,您只需calc在调用 之前调用网格display,然后调用save将新网格写入文件。

至于如何计算下一个网格,嗯,那是你的任务的一部分,我不想全部泄露。

于 2012-03-07T19:41:45.863 回答