我有一個完美的功能。用戶輸入單詞和關鍵字。在關鍵字中可以使用一些字母'?'意思是任意的隨機字母,'*'表示任意數量的字母在末尾,[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的單詞。可悲的是我在這裏慘敗了,因爲它通常不打印任何東西或打印所有的單詞,如果它們匹配或不匹配都沒關係。有誰能告訴我它應該怎麼樣?