2

これは私が遭遇している非常に楽しい問題です。私はスタックオーバーフローで多くの検索を行いましたが、他の人にも同様の問題があることがわかりました。だから私はそれに応じてコードを書きました。私はもともと持っていましたfscan()strcmp()、それは完全に私を爆撃しました。したがって、他の投稿が提案fgets()strncmp()、長さを使用してそれらを比較します。

2つの文字列のサイズを出力して、自分が行っていることをデバッグしようとしました。たぶん、彼らは/nそこか何かに浮かんでいて、それを台無しにしているのではないかと思いました(別の投稿がそれについて話しましたが、私はそれがここで起こっているとは思いません)。したがって、サイズが同じである場合、の制限は同じであるstrncmp()必要があります。右?それらが正しく比較されていることを確認するためだけに。0これで、文字列が同じ場合は、それ以外の場合は。で負の値が返されることがわかりましたstrncmp()。しかし、それは機能していません。

これが私が得ている出力です:

perk
repk
Enter your guess: perk
Word size: 8 and Guess size: 8
Your guess is wrong
Enter your guess: 

これが私のコードです:

void guess(char *word, char *jumbleWord)
{
        size_t wordLen = strlen(word);
        size_t guessLen; 
        printf("word is: %s\n",word);
        printf("jumble is: %s\n", jumbleWord);


        char *guess = malloc(sizeof(char) * (MAX_WORD_LENGTH + 1));
        do
        {
            printf("Enter your guess: ");
            fgets(guess, MAX_WORD_LENGTH, stdin);
            printf("\nword: -%s- and guess: -%s-", word, guess); 
            guessLen = strlen(guess);
            //int size1 = strlen(word);
            //int size2 = strlen(guess); 

            //printf("Word size: %d and Guess size: %d\n",size1,size2);


            if(strncmp(guess,word,wordLen) == 0)
            {
                printf("Your guess is correct\n"); 
                break; 
            }

            }while(1);
    }

以下の提案から更新しました。char *特に、ポインタとしてと何かを文字列として参照することの違いを学んだ後。ただし、それでも同じエラーが発生します。

MAX_WORD_LENGTHこれは、私のプログラムの上部で次のように使用される定義ステートメントであることに注意してください。

#define MAX_WORD_LENGTH 25
4

4 に答える 4

4

strlenではなく、を使用してくださいsizeof。また、strncmpここでは使用しないでください。推測が単語​​の接頭辞である場合、誤って一致が報告されます。を使用しstrcmpます。

于 2012-07-31T19:32:09.177 に答える
2

他の誰もが述べているように、使用しstrlenないでsizeofください。ただし、これが発生している理由は、の基本的な概念がCとは異なるためですJava

Javaポインタへのアクセスは提供されません。Cポインタがあるだけでなく、それらは言語の設計の基本です。ポインタを正しく理解して使用しないとC、物事は意味をなさず、かなりの問題が発生します。

したがって、この場合、sizeofはポインタのサイズを返しchar *ます。これは(通常は)4バイトまたは8バイトです。必要なのは、ポインタの「もう一方の端」にあるデータ構造の長さです。これはstrlenあなたのためにカプセル化するものです。

がない場合はstrlen、ポインタを逆参照してから、終了を示すnullバイトが見つかるまで文字列をウォークする必要があります。

i = 1;
while(*guess++) { i++ }

その後、i文字列の長さを保持します。

アップデート:

細かい部分を除いて、コードは問題ありません。fgetsのドキュメントでは、末尾の改行文字が保持されることに注意してください。

fgetsこれを修正するには、セクションとstrncmpセクションの間に次のコードを追加します。

if ( guess[guessLen-1] == '\n' ) {
    guess[guessLen-1] = '\0'; 
}

そうすることで、末尾の改行があれば削除され、1つずれることはなくなります。

于 2012-07-31T19:44:57.440 に答える
2

sizeof(guess)文字列の長さではchar * なく、のサイズを返しますguess。問題は、sizeof文字列の長さを管理するために使用していることです。Cには、文字列の長さの関数がありますstrlen

sizeofデータ型と配列のサイズを決定するために使用されます。sizeof1つの非常に特殊なケースでのみ文字列に対して機能します(ここでは説明しません)が、それでも、常にstrlen文字列の長さを処理するために使用します。

単語に使用できる文字数を決定する必要があります。これはゲームの特性です。つまり、ゲーム内の単語の長さが11文字を超えることはありません。

それで:

// define this somewhere, a header, or near top of your file
#define MAX_WORD_LENGTH 11

// ...

size_t wordlen = strlen(word);
size_t guessLen;

// MAX_WORD_LENGTH + 1, 1 more for the null-terminator:
char *guess = malloc(sizeof(char) * (MAX_WORD_LENGTH + 1));

printf("Enter your guess: ");
fgets(guess, MAX_WORD_LENGTH, stdin);

guessLen = strlen(guess);

また、ドキュメントを確認fgetsし、改行文字入力に保持されることに注意してください。したがって、2つの単語を比較する場合は、それを考慮する必要があります。これに対する簡単な修正の1つは、の長さまでだけを比較し、の長さまでは比較し ないことです。したがって、次のwordようguessなりますif( strncmp(guess, word, wordLen) == 0)。このクイックフィックスの問題は、無効な入力を渡すことです。つまり、wordeject、でguessあるejection場合、比較は成功します。

最後に、ループの各反復で新しいメモリを割り当てる理由はありguessません。すでに割り当てた文字列を使用するだけです。関数の設定を次のように変更できます。

char guess(char *word, char *jumbledWord)
{
    int exit;

    size_t wordLen = strlen(word);
    size_t guessLen; 

    char *guess = malloc(sizeof(char) * (MAX_WORD_LENGTH + 1));

    do
    {
        printf("Enter your guess: ");
        // ...
于 2012-07-31T19:34:09.613 に答える
1

コードに関する問題/アドバイスのリスト。コメントに収めるには長すぎます。

  • charあなたの関数は奇妙なaを返します。ロジックがわかりません。さらに重要なのは、実際には値を返さないことです。そうしないでください、それはあなたに問題をもたらすでしょう
  • Cの他の制御構造体を調べてください。特に、何もしないでくださいexit。まず、exitCには関数があり、それが言うことを実行し、プログラムを終了します。次にbreak、ループを残すステートメントがあります。

一般的なイディオムは

do {

   if (something) break;
} while(1)
  • 反復ごとにバッファを割り当てますが、決して割り当てませんfree。これにより、大きなメモリリークが発生し、バッファが無駄になり、コードにアクセスできなくなります。
  • あなたのアプローチは文字列が同じ長さである場合strncmpにのみ正しいので、最初にそれをテストする必要があります
于 2012-07-31T20:22:43.560 に答える