2014-01-19 138 views
0

我有一個完美的功能。用戶輸入單詞和關鍵字。在關鍵字中可以使用一些字母'?'意思是任意的隨機字母,'*'表示任意數量的字母在末尾,[x,y,z]表示該字母可以是x或y或z,然後函數檢查這些單詞是否匹配。下面是它的樣子:列表元素而不是陣列C

int MatchWord(char *Word, char *Sequence) 

{ 

int i = 0; 
int j = 0; 
int k = 0; 
int LastChar = 0; 
int CharMatch = 0; 
char SpecifiedChars[20]; 
while(Word[i]!='\0' && Sequence[j]!='\0') 
{if(isalpha(Sequence[j])) 
    { 
     if(Word[i]!=Sequence[j]) 
     {return 0;} 
     i++; 
     j++; 
    } 

    if(Sequence[j] == '?') 
    { 
     i++; 
     j++; 
    } 

    if(Sequence[j] == '[') 

    { 

     j++; 
     while(Sequence[j]!= ']') 

     { 
      if(isalpha(Sequence[j])) 
      { 
       SpecifiedChars[LastChar] = Sequence[j]; 
       LastChar++; 
       j++; 
      } 
      else 
      {j++;} 
     } 
     j++; 
     for(k = 0 ; k <= LastChar ;k++) 
     { 
      if(SpecifiedChars[k]==Word[i]) 
      {CharMatch = 1;} 
      SpecifiedChars[k] = ' '; 
     } 
     SpecifiedChars[0] = '\0'; 
     LastChar = 0; 
     if(!CharMatch) 
     {return 0;} 
     i++; 
    } 
    if(Sequence[j] == '*') 
    { 
     j++; 
     while(Word[i]!='\0') 
     {i++;} 
    } 
} 
return 1; 
} 


int main() 
{ 
char word[30], keyword[30]; 
printf("Type the word: \n"); 
scanf("%s",word); 
printf("Type the key: \n"); 
scanf("%s",keyword); 
if(MatchWord(word,keyword)) 
{ 
    printf("\nWords match"); 
} 
else 
{ 
    printf("\nWords don't match"); 
} 
return 0; 
    } 

但我必須改變它,與其讓用戶鍵入的第一個字,它會檢查文件TXT在基地的話我有。他們在結構:

typedef struct bazaslowek         
    { 
     char *word1; 
     char *category; 
     struct bazaslowek* next; 
    } baza; 

這就是我如何把他們的名單,這也完美的作品上:

char word1[30]; 
char category[20]; 
FILE *fp; 
if ((fp = fopen("bazaslow.txt", "r"))==NULL) 
    {printf("Error!"); 
    exit(EXIT_FAILURE);} 
else 
    { 
    while(!feof(fp)) 
     { 
     fscanf(fp,"%s %s \n", word1, category); 
     baza *wsk = *head; 
     baza *new = malloc (sizeof(baza)); 
     new -> next = NULL; 
     new -> word1 = strdup(word1); 
     new -> category = strdup(category); 
     if(wsk == NULL) 
      { 
      new -> next = *head; 
      *head = new; 
      } 
     else 
      { 
      while(wsk -> next != NULL) 
      wsk = wsk -> next; 
      wsk -> next = new; 
      } 
     } 
    } 
fclose(fp); 

我試圖把一切都在一個循環,使同時wsk->next!=NULL它會檢查keyword匹配word1,如果是的話,它會打印它並檢查另一個單詞,如果不是,它會轉到列表中另一個沒有printf的單詞。可悲的是我在這裏慘敗了,因爲它通常不打印任何東西或打印所有的單詞,如果它們匹配或不匹配都沒關係。有誰能告訴我它應該怎麼樣?

回答

0

您需要顯示新的wsk和head是如何定義的。此外,它將有助於給變量wsk一個有意義的名字。我認爲你用來迭代你的列表的代碼也會有幫助。

最後,這裏是如何我通常去填補鏈表:

baza *head = NULL, *tail, *new; 
while(whatever condition) { 
    new = malloc(sizeof(baza); 
    new->next = NULL; 
    new->word1 = strdrup(word1); 
    new->category = strdrup(category); 

    if(head) { 
     tail->next = new; 
     tail = new; 
    } else { //first element, init head, tail 
     head = tail = new; 
    } 
} 

這個,你可以通過你的列表行走,從頭部開始後。

所有在一起,我認爲你需要處理你的變量命名,縮進和排版。你也應該做一些錯誤檢查。例如,您可以使用fscanf的返回值來查看有多少分配:while(fscanf(blabl)== 2){}