Печать переменной приводит к пустой строке - PullRequest
0 голосов
/ 05 декабря 2018

После возврата структуры со всей информацией из проанализированного файла все элементы данных печатаются как пустые строки, кроме одного элемента данных в структуре, который не является указателем.Я думаю, что это проблема с обработкой указателей, но я не уверен.Например, я установил 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;

}

Этот код анализирует файл.Любая строка, начинающаяся с «#», является комментарием и не будет использоваться.Первые две строки файла являются именами, третья строка - числом, и любая строка после этого будет иметь десять целых чисел с символом новой строки в конце.

1 Ответ

0 голосов
/ 05 декабря 2018

Вы сохраняете адрес буфера чтения в структуре 'map', содержимое которой будет обновляться при каждом вызове getline().Вы можете исправить это, выполнив следующие изменения

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 ){
                                        line_end = strchrnul(buf,'\n');
                                        line_size = line_end - buf;
                                        game->defender = malloc(line_size + 1);
                                        strncpy(game->defender,buf,line_size;
                                }
                        }
                        else if( lineNum == 2 ){
                                if( game->attacker == NULL ) {
                                        line_end = strchrnul(buf,'\n');
                                        line_size = line_end - buf;
                                        game->attacker = malloc(line_size + 1);
                                        strncpy(game->attacker,buf,line_size;
                                }
                        }
                        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] = malloc(sizeof(int));
                                        *game->layout[game->size] = *(int*)token;
                                        game->size = game->size + 1;
                                        token = strtok(NULL, delim);
                                }
                        }

                        lineNum++;
                }

        }
...