2016-12-14 3 views
-2

Im новый для C, и у меня возникают проблемы с этим кодом, который я пишу. Я почти на 100% уверен, что из-за моей секции массива сравнения, но я действительно не знаю, что изменить. Может ли кто-нибудь помочь? Если вам нужен весь мой код, я могу также опубликовать его. Код должен сравнивать буквы, введенные пользователем со словами в документе .txt и посмотреть, можете ли вы произнести любые слова с этими буквами.Может ли кто-нибудь помочь мне с этим массивом сравнения?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define SIZE 99 
#define NUM_WORDS 100 

void find_frequency(char string[], int count[]); 
int compare_arrays(int dictionary[], int user[]); 

int main() 
{ 
    int total_words=11; //number of words 
    char dictionary_words[NUM_WORDS][SIZE]; //store words in directory 
    FILE *cfPtr; //dictionary.txt pointer 

    if ((cfPtr=fopen("dictionary.txt","r"))==NULL)//try to open file 
    { 
     puts("File dictionary.txt could not be opened."); 
     exit(1);//exit if file doesn't open 
    } 

    else{ //Read each word from the dictionary and save to array 
     char line[SIZE]; //save each word 

     { 
      while(fgets(line,SIZE,cfPtr)!= NULL) 
        { 
         char*tokenPtr=strtok(line, "\t"); 
         while(tokenPtr != NULL) 
         { 
          strcpy(dictionary_words[total_words],tokenPtr); 
          total_words++; 
          tokenPtr = strtok(NULL, "\t"); 
         } 

        } 
     } 
     } 
    fclose(cfPtr);//close file 

    char string[11];//get string of characters from user 
    int count[26]={0};//store the number of each letter 

    printf("Enter letters:\n"); 
    scanf("%s", string); 


    find_frequency(string, count);//count of each character entered 

    char temp[SIZE]; 
    int temp_count[26]={0};//convert words into letters 
    int i; 

    for(i=0; i<=total_words; i++); 
    { 
     strcpy(temp,dictionary_words[i]); 
     find_frequency(temp,temp_count);//convert word to letters in alphabet 

     if (compare_arrays(temp_count,count))//compare words with letters entered 
     { 
      printf("%s:", temp);//print what you can spell 
     } 
     else 
     { 
      printf("broken", temp); 
     } 
     memset(temp_count,0,sizeof(temp_count));//test next word 
    } 
    return(0); 
}//end main 

//define function 
void find_frequency(char string[],int count[]) 
{ 
    int i; 
    for(i=0; string[i] != '\0'; i++) 
    { 
     if (string[i] >= 'a' && string[i] <= 'z') 
     { 
      count[string[i]-'a']++; 
     } 
    } 
} 

int compare_arrays(int dictionary[], int user[]) 
{ 
    int j = 0; 

    while (user[j] >= dictionary[j]) 
    { 
     j++; 
     if (j == 26) 
     { 
      return 0; 
     } 
     else 
     { 
      printf("also broken"); 
     } 
    } 
    return 1; 
} 
+2

Мы не можем читать ваши мысли и выяснить, что должен делать код. Пожалуйста, добавьте больше объяснений. – unwind

+0

Это выглядит так, как будто вам нужен цикл ('while') и условие (' if'), но здесь у вас есть два условия. В противном случае, как вы ожидаете, что 'j' достигнет 26? –

+0

@chrisjn Как вы хотите сравнить массивы? Вы хотите проверить, являются ли они равными или что первый не меньше второго? –

ответ

0

Не уверен, что это правильный ответ, как это трудно догадаться, что вы на самом деле пытаетесь сделать, но вы, вероятно, хотите этого, или что-то подобное:

int compare_arrays(int dictionary[], int user[]) 
{ 
    int j = 0; 

    while (user[j] >= dictionary[j]) 
    { 
     j++; 
     if (j == 26) 
     { 
      return 0; 
     } 
    } 
    return 1; 
} 
+0

Спасибо за помощь, но я все еще получаю ту же проблему. Я должен был, вероятно, рассказать, что именно я имел в виду, когда задавал вопрос. Проблема заключается в том, что я ничем не печатаю. Я решил добавить в «сравнительные массивы» инструкцию «else», и он продолжает печатать то, что я написал в «else». – chrisjn

+0

@chrisjn вам нужно предоставить дополнительную информацию, иначе мы не сможем. –

+0

Отправленный мой весь код.Код должен пробовать пользователя для серии букв. Чем читать в письмах и распечатывать, какие словарные слова могут быть сделаны из букв, которые вы вводите. Моя проблема - всякий раз, когда я вводил бы что-нибудь, что я ничего не получил бы. Я добавляю дополнительную строку, где я сравниваю массивы, чтобы увидеть, работает ли она, и это не похоже. Он продолжает печатать «также сломанную» строку, которую я добавил. – chrisjn

0

Вы возвращаете неправильный результат ,

int compare_arrays(int dictionary[], int user[]) 
{ 
    int j = 0; 

    while (user[j] >= dictionary[j]) 
    { 
     j++; 
     if (j == 26) 
     { 
      // You have checked all 26 letters and for all of them condition is true. Therefore a word can be made from user entered letters. 
      return 1; 
     } 
    } 
    return 0; //Word can not be made from user entered letters 
} 

Если вы хотите, чтобы заботиться о чувствительности к регистру,

void find_frequency(char string[],int count[]) 
{ 
    int i; 
    for(i=0; string[i] != '\0'; i++) 
    { 
     //If letter is in upper case, it will be converted to lower case before checking. 
     if (tolower(string[i]) >= 'a' && tolower(string[i]) <= 'z') 
     { 
      count[tolower(string[i])-'a']++; 
     } 
    } 
} 

UPDATE 1:

Ошибка в tokenizing. 1) int total_words=11; //number of words Вы используете эту переменную в качестве индекса массива. Поэтому он должен быть инициализирован равным нулю. Или вы объявляете другую переменную для индекса. int index=0;

2) strtok вернет адрес начала токена. Таким образом, вы пишете слова с токеном, а не копируете нулевой ограничитель.

char *prevTokenPtr = line; 
    while(fgets(line,SIZE,cfPtr)!= NULL) 
    { 
     char*tokenPtr=strtok(line, "\t"); 
     while(tokenPtr != NULL) 
     { 
      /* Copy from last token to this token. */ 
      int lengthToCopy = (tokenPtr - prevTokenPtr)/sizeof(char); 
      strncpy(dictionary_words[index], prevTokenPtr, lengthToCopy); 
      dictionary_words[index][lengthToCopy] = '\0'; 

      printf("dictionary_words[%d] is [%s]\n", index, dictionary_words[index]); 
      index++; 

      prevTokenPtr = tokenPtr + 1; //Neglect '\t' 
      tokenPtr  = strtok(NULL, "\t"); 
     } 

     /* Copy the last word. */ 
     if(NULL != prevTokenPtr) 
     { 
      strcpy(dictionary_words[index], prevTokenPtr); 
      printf("dictionary_words[%d] is [%s]\n", index, dictionary_words[index]); 
      index++; 
     } 
    } 

Обратите внимание:

1) Я предполагаю, что вход, как это. "word1" \ t "word2" \ t "word3" \ t ... \ t "wordN"

2) Я не тестировал этот код. Отпечатки должны помочь вам отладить дальнейшие действия.

+0

После редактирования этого в моем коде. Я все равно получаю одинаковые результаты. После ввода некоторых букв, которые, как я знаю, должны писать что-то, что я получаю, это «:» – chrisjn

+0

@chrisjn. Это может быть другая проблема. (1) Напечатать temp до и после вызова find_frequency() и убедиться, что это правильно. (2) Печатайте словаря [i] с помощью temp и убедитесь, что это также верно. (3) Вы объявили 'char string [11];'. Убедитесь, что вы не вводите более 10 символов. Лучше делать 'scanf («% 10s », строка); string [10] = '\ 0'; 'Попробуйте с этими изменениями и сообщите мне ваше наблюдение. – MayurK

+0

Я добавил эти команды печати temp с \ n, чтобы они были напечатаны на разные строки, но все они печатаются пустые строки. Я пробовал печатать словаря [i], и я просто получил пустую строку. Зачем это делать? – chrisjn