2012-03-12 11 views
1

私はC言語では新しく、実際の単語を明らかにするために文字列の入力を解読するプログラムを作ろうと考えていましたが、うまくいきませんでした。ここでは正常に動作して、それの例である:Cのスクランブルを外す文字列

は、Wordを入力します。
マッチ付き合え:
マッチを投稿:ポットは
マッチ:スポット
マッチ:トップス: マッチを停止

マッチを停止

私は「aspell」というプログラムから得た単語リストを使用しています。これにより、私は完全なファイルを作成できましたrds。奇妙なのは、「テスト」や「サッカー」のような言葉を入力すると、入力語に元々は存在しない文字を含む単語が返されるということです。私はここで間違って何をしていますか?以下は、ほとんどの作業を行うunscrambleWord関数です。何らかの理由で

Enter Word:football 

Match: blastoff 
Match: boastful 
Match: flatboat 
Match: football 
Match: lifeboat 
Match: softball 

、そこのSさんは、試合文字列であるが、文字の数があるように見える。また、私はここで

int unscrambleWord(int fgLetters) { 

     // integer used for the counter 
     int i = 0; 

     // first make sure that the lengths of the word and of the list word is the same 
     if(strlen(currentLine) == strlen(input)) { 

       // loop through each letter in the word given 
       for(i = 0; i < strlen(input); i++) { 

         // search the line for the current letter, if we find it increment fgLetters 
         if(strchr(currentLine, input[i]) != NULL) 
           fgLetters++; 

       } // end for 

       // once we have finished looping through the word; evaluate fgLetters 
       if(fgLetters == strlen(input)) { 

         // fgLetters will be equal to the length of the word if each letter appears in the word 
         printf("\tMatch: %s \n", currentLine); 

       } // end if - evaluate length of fgLetters 

     } 

    // return the fgLetters after we have possibly incremented it 
     return fgLetters; 

} 

は、サッカーの一例である「サッカー」の例を掲載します同じ。

答えて

3

このアルゴリズムは偽陽性を示します。

単語footballのすべての文字は、softballという語になります。しかし、それはあなたが単語を変更するために文字を並べ替えることができるというわけではありません。 2つのoを同じo文字に一致させます。

マッチを見つける簡単な方法は、文字をソートして、同じ単語を取得することです。

football -> abflloot 
softball -> abfllost 
+0

私はあなたのアルゴリズムが好きです。 – EricSchaefer

+0

はい、これは良い考えです、私はそれを考えなかった! –

1

源からの手紙を入力していない現在の行の文字がある場合は、現在の行に含まれますが、されていない場合にのみチェックされています。また、単語リストの入力と行に複数回ある文字を処理する必要があります。

+0

これは私が考える最良の説明の答えなので、おそらく私は二度「のための」ループを実行する必要がありますが、入力およびcurrentLine変数を切り替えますか? –

+0

それは間違った答えです。あなたがまだ偽陽性を確認できるかどうかを確認しても。 (例: 'goo'と' gog')。私の答えをチェックしてください。 –

+0

Karolysの答えを使用してください。入力と現在の行をソートして比較します。それはそれより簡単にはなりません。 – EricSchaefer

2

繰り返し文字をカウントオーバーさせることができます。たとえばfootballには2つの「o」と2つの「l」があります。したがって、あなたは誇らしげにsとuを許可します。

Cのコードでは、一度strlenの結果を取得し、むしろそれを繰り返し呼び出すよりも、あまりにも、あなたのループ内でそれを使用するために、通常は賢明です。 Cコンパイラの中で最もスマートなのは、ループを通過するたびにstrlen(word)が同じであることに気付くだけです。

関連する問題