C-结构内的结构数组在dfa程序中返回意外结果

时间:2018-08-31 13:48:24

标签: c arrays struct

我正在尝试制作一个根据用户输入创建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”。但是,当我开始将每个节点作为状态ID分配到dfa结构中时,最终状态将分配给每个状态的ID。以下代码中的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 :(得分:1)

问题是这两行:

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

state结构中,id成员是指向可变字符串的指针。存储该字符串的内存只分配了一次,其地址已存储在每个状态struct中。

为了使每个州都有自己的ID,您需要为每个州分配一个新的ID缓冲区。您可以在运行时使用malloc动态地执行此操作,也可以将缓冲区的存储内容简单地包含在state结构中,如下所示:

typedef struct state {
    char id[MAX_ID_LENGTH+1];
    int isInitial;
    int isFinal;
} STATE_T;