После возврата структуры со всей информацией из проанализированного файла все элементы данных печатаются как пустые строки, кроме одного элемента данных в структуре, который не является указателем.Я думаю, что это проблема с обработкой указателей, но я не уверен.Например, я установил char * в структуре, равной имени в файле.Сразу после установки переменной я выведу ее, и имя будет правильным, но как только я верну указатель на структуру, или когда я нахожусь вне цикла while, который читает файл, при попытке вывести пустую строкунапечатать имя.Любая помощь будет потрясающей.Спасибо.
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define _DEFAULT_MAP_SIZE 10
#define _MAX_SIZE 80
typedef struct Map_s{
char * defender;
char * attacker;
int missles;
int ** layout;
size_t capacity;
size_t size;
}map;
Первый фрагмент кода показывает, какие заголовки файлов я включил, вместе со структурой, которая будет использоваться.
map * newGame(){
map * game = malloc(sizeof(map));
game->layout = (int**)malloc(_DEFAULT_MAP_SIZE * sizeof(int*));
game->defender = NULL;
game->attacker = NULL;
game->missles = 0;
game->capacity = _DEFAULT_MAP_SIZE;
game->size = 0;
return game;
}
Функция для инициализации нового типа структуры
map * parseFile( FILE * fp ){
map * game = newGame();
char * token;
const char delim[2] = " ";
char * buf = NULL;
char * temp = NULL;
size_t size = _MAX_SIZE;
int lineNum = 1;
while( getline(&temp, &size, fp) > 1 ){
buf = strtok(temp, "\n");
//printf("%s\n", buf);
if( buf[0] != '#' ){
printf("%s\n", buf);
printf("%d\n", lineNum);
if( lineNum == 1){
if( game->defender == NULL ){
game->defender = buf;
}
}
else if( lineNum == 2 ){
if( game->attacker == NULL )
game->attacker = buf;
}
else if( lineNum == 3 ){
game->missles = atoi(buf);
}
else if( lineNum > 3 ){
token = strtok(buf, delim);
while( token != NULL ){
if( game->size >= game->capacity ){
game->layout = (int**)realloc(game->layout, \
game->capacity*2 * sizeof(int*));
game->capacity = game->capacity * 2;
}
game->layout[game->size] = (int*)token;
game->size = game->size + 1;
token = strtok(NULL, delim);
}
}
lineNum++;
}
}
return game;
}
Этот код анализирует файл.Любая строка, начинающаяся с «#», является комментарием и не будет использоваться.Первые две строки файла являются именами, третья строка - числом, и любая строка после этого будет иметь десять целых чисел с символом новой строки в конце.