2014-01-19 4 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; 
    } 

Но я должен изменить, что вместо того, чтобы позволить пользователю ввести первое слово, он проверяет слова в базе у меня есть в текстовом файле. Они в составе:

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

Смежные вопросы