2015-07-12 63 views
2

我想實現DFA(Deterministic Finite Automaton)在C,到目前爲止我試圖存儲DFA在變量transitions轉換如下代碼所示。但由於某種原因, odd指數transitions中的數據被破壞,我認爲這是因爲我用分隔\0的方式。我在代碼後面附加了輸出,謝謝。數據損壞,同時存儲在字符***

#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); 
    } 
} 

OUTPUT

+0

關於如下行:'scanf(「%s」,&temp_state);' temp_state只有5個字符長,所以最大輸入長度爲4(允許%s附加終止字節),但是沒有任何東西阻止用戶輸入'abcde',這會使輸入緩衝區溢出,導致未定義的行爲並可能是一個seg故障事件。建議:每次調用帶有%s格式參數的scanf(),都要包含一個長度修飾符(在本例中爲4)。另外,始終檢查scanf()返回的值(不是參數值),以確保操作是成功 – user3629249

+0

當調用malloc(和函數族)時1)sizeof(char)始終爲1,對返回值沒有影響,並且只會混淆C中的代碼2)不要從malloc()返回返回的值。它已經是一個'void *',所以可以保存到任何其他指針) – user3629249

+0

在這行之前:'exit(0);'和程序中的任何其他退出點,將所有分配的內存指針傳遞給free()。否則會有(很多)內存泄漏。 – user3629249

回答

4

這可能是這個問題:

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每個循環分配transitions[i],而不是使用:

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); 
    } 
} 

j循環您realocate整個transitions[i]這將導致只有最後一個字符串將被存儲

+1

啊非常感謝你:) –

+0

沒問題@PruthviRaj – maskacovnik