*(strchr(in, '\n')) = '\0';
Плохое дзюю.Если strchr
вернет NULL, это будет ошибка по умолчанию.Я знаю, что ваши данные всегда будут иметь новую строку, но это плохая привычка. Всегда присваивает результат strchr
переменной и сначала выполняет проверку NULL:
char *tmp = strchr(in, '\n');
if (tmp)
*tmp = 0;
Честно говоря, я считаю, что ваша сетка как массив строк вызовет больше скорби, чемэто решит.Относитесь к нему так же, как к 2d-массиву любого другого типа.Работа с символами новой строки в конце каждой строки во входном файле будет проблемой независимо от того, что вы делаете.
Что касается структурирования кода, подумайте о проблеме на высоком уровне:
- Вам нужно загрузить файл в качестве стартовой сетки;
- Вам нужно вычислить сетку для следующего поколения для некоторого числа
- Вам нужно отобразить каждую сетку;
- Вам необходимо записать каждую сетку в файл.
Вы уже разбили код дисплея на его собственную функцию;вам просто нужно сделать то же самое для функций загрузки, вычисления и записи (вы можете оставить код загрузки файла в 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
, чтобы записать новую сетку вфайл.
Что касается как вычислить следующую сетку, ну, это часть вашего задания, и я не хочу отдавать ее всем .