2014-01-19 2 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를 사용하고 다른 단어를 검사합니다. 그렇지 않으면 printf없이 목록의 다른 단어로 이동합니다. 슬프게도 나는 여기에 비참하게 실패한다. 보통 printf를 전혀하지 않거나 모든 단어를 printfs하지 않기 때문에 일치하는지 여부는 중요하지 않다. 아무도 제발 어떻게 말해줘야 해?

답변

0

어떻게 새롭고, wsk와 머리가 정의되어 있는지 보여줄 필요가 있습니다. 또한 변수 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) {}