我被要求:
创建一个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++]));
}
答案 0 :(得分:3)
*(strchr(in, '\n')) = '\0';
坏juju。如果strchr
返回NULL,则会出现段错误。我知道你的数据总会有换行符,但这是一个不好的习惯。 始终将strchr
的结果分配给变量并首先执行NULL检查:
char *tmp = strchr(in, '\n');
if (tmp)
*tmp = 0;
坦率地说,我认为将网格视为一个字符串数组会导致比解决更多的悲伤。像对待任何其他类型的二维数组一样对待它。无论你做什么,处理输入文件中每行末尾的换行都会很痛苦。
至于如何构建代码,请从高层次考虑问题:
您已经将显示代码拆分为自己的功能;你只需要为加载,计算和编写函数做同样的事情(你可以将文件加载代码保留在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) {...}
因此,每次进入main
时,您只需在调用calc
之前调用网格上的display
,然后调用save
来编写新网格到文件。
至于如何来计算下一个网格,那么,这是你的任务的一部分,而且我不想让它所有。