C 以字符形式存储时数据损坏***

C 以字符形式存储时数据损坏***,c,C,我试图在C中实现DFA(确定性有限自动机),到目前为止,我试图将DFA的转换存储在变量transitions中,如下代码所示。但由于某种原因,transitions的奇索引中的数据正在损坏,我想这是因为我使用定界的方式?。我已经将下面的输出附加到代码中,谢谢 #include<stdio.h> #include<string.h> #define MAX_INPUTS 10 #define MAX_INPUT_SIZE 5 #define MAX_STATES 20 #d

我试图在C中实现
DFA
(确定性有限自动机)
,到目前为止,我试图将
DFA
的转换存储在变量
transitions
中,如下代码所示。但由于某种原因,
transitions
索引中的数据正在损坏,我想这是因为我使用定界的方式?。我已经将下面的输出附加到代码中,谢谢

#include<stdio.h>
#include<string.h>
#define MAX_INPUTS 10
#define MAX_INPUT_SIZE 5
#define MAX_STATES 20
#define MAX_STATE_SIZE 5
#define MAX_ID_SIZE 100
int get_id(char str[],char str_arr[][MAX_STATE_SIZE],int len)
{
    int i;
    for(i=0;i<len;i++)
    {
        if(strcmp(str,str_arr[i]) == 0)
            return i;
    }
    return -1;
}
int main()
{
    char inputs[MAX_INPUTS][MAX_INPUT_SIZE];
    char states[MAX_STATES][MAX_STATE_SIZE];
    char*** transitions;
    char temp_state[MAX_STATE_SIZE],temp_input[MAX_INPUT_SIZE],id_string[MAX_ID_SIZE],cur_inp[MAX_INPUT_SIZE],cur_state[MAX_STATE_SIZE];
    int i,j,k,numinps,numstates,row_id,col_id;
    printf("Enter number of input states: ");
    scanf("%d",&numstates);
    printf("Enter number of input symbols: ");
    scanf("%d",&numinps);
    transitions = (char ***) malloc(sizeof(char**)*numstates);
    printf("Enter the input states: \n");
    for(i=0;i<numstates;i++)
    {
        scanf(" %s",&temp_state);
        strcpy(states[i],temp_state);
    }
    printf("Enter the input symbols: \n");
    for(i=0;i<numinps;i++)
    {
        scanf(" %s",temp_input);
        strcpy(inputs[i],temp_input);
    }
    printf("Enter the transitions:\n");
    for(i=0;i<numstates;i++)
    {
        for(j=0;j<numinps;j++)
        {
            transitions[i] = (char **) malloc(sizeof(char)*MAX_INPUT_SIZE*numinps);
            transitions[i][j] = (char *) malloc(sizeof(char)*MAX_STATE_SIZE);
            printf("\n( %s , %s ) => ",states[i],inputs[j]);
            scanf(" %s",temp_state);
            strcpy(transitions[i][j],temp_state);
        }
    }
    for(i=0;i<numstates;i++)
        for(j=0;j<numinps;j++)
            printf("\n TRANSITION: ( %s , %s) =>  %s\n",states[i],inputs[j],transitions[i][j]);
    printf("Enter a String to find ID: ");
    scanf(" %s",id_string);
    strcpy(cur_state,"q0");
    for(i=0;i<strlen(id_string);i++)
    {
        cur_inp[0] = id_string[i];
        cur_inp[1] = '\0';
        row_id = get_id(cur_inp,inputs,numinps);
        if(row_id == -1)
        {
            printf("Input symbol is not present in sigma");
            exit(0);
        }
        col_id = get_id(cur_state,states,numstates);
        strcpy(cur_state,transitions[row_id][col_id]);
        printf("\n---- %s => %s ----\n",cur_inp,cur_state);
    }
}
#包括
#包括
#定义最大输入10
#定义最大输入大小5
#定义最大状态20
#定义最大状态大小5
#定义最大ID大小100
int get_id(字符str[],字符str_arr[][最大状态大小],int len)
{
int i;

对于(i=0;i这可能是问题:

for(i=0;i<numstates;i++)
{
    for(j=0;j<numinps;j++)
    {
        transitions[i] = (char **) malloc(sizeof(char)*MAX_INPUT_SIZE*numinps); // <- this line
        transitions[i][j] = (char *) malloc(sizeof(char)*MAX_STATE_SIZE);
        printf("\n( %s , %s ) => ",states[i],inputs[j]);
        scanf(" %s",temp_state);
        strcpy(transitions[i][j],temp_state);
    }
}

j
循环中,您重新分配整个
转换[i]
,这会导致只存储最后一个字符串

没有问题@pruthviraja关于以下行的问题:'scanf(“%s”),&temp_state);'temp_state只有5个字符长,因此最大输入长度为4(允许终止字节附加%s)但是,没有任何东西可以阻止用户输入'abcde',这将使输入缓冲区溢出,从而导致未定义的行为,可能还会导致seg故障事件。建议:对于使用%s格式参数调用scanf(),要包含长度修饰符(在本例中为4),请始终检查返回值(而不是参数值)从scanf()为确保调用malloc(和函数族)时操作成功,1)sizeof(char)始终为1,对返回值没有影响,只是使代码混乱2)在C中,不要将malloc()中的返回值(它已经是“void*”,因此可以保存到任何其他指针)强制转换到此行:“exit(0)”;'和程序中的任何其他退出点,将所有分配的内存指针传递给free()。否则将有(大量)内存泄漏。函数:main()声明为返回“int”。而“现代”编译器将允许没有“return value;”语句。不提供这样的语句是非常糟糕的程序实践。(如果没有提供return语句,那么将返回(我忘记了哪个寄存器)的当前内容,这将导致操作系统认为程序已退出并出现故障。)@user3629249,谢谢您的建议:),我通常在完成程序后执行所有这些操作
for(i=0;i<numstates;i++)
{
    transitions[i] = (char **) malloc(sizeof(char)*MAX_INPUT_SIZE*numinps);
    for(j=0;j<numinps;j++)
    {
        transitions[i][j] = (char *) malloc(sizeof(char)*MAX_STATE_SIZE);
        printf("\n( %s , %s ) => ",states[i],inputs[j]);
        scanf(" %s",temp_state);
        strcpy(transitions[i][j],temp_state);
    }
}