C - Массив структур в структуре, возвращающий неожиданные результаты в программе dfa - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь создать программу, которая создает dfa на основе пользовательского ввода. Каждый узел и переход должны быть структурой, а dfa - также структурой. Структура dfa содержит массив структур узлов и связанный список структур переходов. Вот что у меня есть:

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

#define MAX_STATES 25
#define TRUE 1
#define FALSE 0
#define MAXCHAR 256

/* struct for a state of the DFA */
typedef struct state {
    char *id;
    int isInitial;
    int isFinal;
} STATE_T;

/* struct for a transition of the DFA*/
typedef struct transition {
    STATE_T *startState;
    char condition;
    STATE_T *endState;
    struct transistion *next;
} TRANSITION_T;

/* struct for the DFA */
typedef struct automaton {
    STATE_T state[MAX_STATES];
    TRANSITION_T *transition;
} AUTOMATON_T;

/* main function reads initial user inputs to build dfa */
int main() {
    AUTOMATON_T dfa;
    STATE_T stateA;
    TRANSITION_T *trans;

Первая строка текстового файла - это запятые узлы / состояния, например: «a, b, c». Но когда я получаю назначение каждого узла в качестве идентификатора состояния в структуру dfa, конечному состоянию присваивается идентификатор для каждого отдельного состояния. Оператор for в следующем коде печатает 0c 1c 2c, где я ожидал бы 0a 1b 2c.

    FILE *fp = fopen(fileName, "r");

    while (fgets(useIn, MAXCHAR, fp)) {
        if (lineNum == 0) {
            i = 0;
            char *token = strtok(useIn, ",");
            while (token != NULL) {
                strcpy(stateId, token);
                stateA.id = stateId;
                dfa.state[i] = stateA;
                i++;
                token = strtok(NULL, ",");
            }
            stateAmt = i;
            for (i = 0; i < stateAmt; i++) {
                printf("%d", i);
                printf("%s", dfa.state[i].id);
            }
        }
    fclose(fp);
    return 0;
}

С чего бы это? Я неправильно обрабатываю массив состояний?

1 Ответ

0 голосов
/ 31 августа 2018

Проблема заключается в следующих двух строках:

strcpy(stateId, token);
stateA.id = stateId;

В структуре state член id является указателем на изменяемую строку. Память для хранения этой строки была выделена только один раз, и ее адрес был сохранен в каждой структуре состояния.

Чтобы каждое состояние имело свой собственный идентификатор, необходимо выделить новый буфер идентификатора для каждого состояния. Вы можете сделать это динамически, используя malloc во время выполнения, или вы можете просто включить хранилище для этого буфера как часть структуры state, например:

typedef struct state {
    char id[MAX_ID_LENGTH+1];
    int isInitial;
    int isFinal;
} STATE_T;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...