2016-12-14 7 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')が必要なように見えますが、ここでは2つの条件があります。そうでなければ、 'j'が26になるのをどのように期待しますか? –

+0

@chrisjnどのように配列を比較したいですか?それらが等しいか、最初のものが2番目のものよりも小さくないかどうかチェックしますか? –

答えて

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:トークン化で

エラー。 1)int total_words=11; //number of words この変数は配列インデックスとして使用しています。したがって、ゼロに初期化する必要があります。または、indexの別の変数を宣言します。 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)find_frequency()を呼び出す前と後にtempを表示し、それが正しいことを確認してください。 (2)dictionary_words [i]をtempで印刷し、それも正しいことを確認します。 (3)あなたは 'char string [11];を宣言しました。 10文字以上入力していないことを確認してください。 'scanf("%10s "、string);を使った方が良いでしょう。 string [10] = '\ 0'; 'これらの変更を試して、あなたの観察を教えてください。 – MayurK

+0

これらのprint tempコマンドを\ nで追加して、異なる行に印刷するようにしましたが、それらはすべて空行です。私はdictionary_words [i]を印刷しようとしましたが、私も空白行があります。なぜこれをやっているのだろう? – chrisjn

関連する問題