1

私は C でのプログラミングが初めてで、ユーザーが自分の名前を入力すると、性的指向がランダムに示されるプログラムを作成しようとしています。それでも、gcc がエラーになっているのは、17行目: if(strcmp(x, arrayNames[i] == 0));. strcmp(); にはあまり詳しくありません。しかし、私はそれについてK&Rで読んでいますが、頭がわかりません。以下はコード全体です。

int main()
{
    char *arrayNames[3]={"Jim", "Bob", "Dave"};
    char *arrayOrient[3]={"straight", "gay", "bi"};
    char x[100];
    srand(time(NULL));
    int size;
    size = sizeof(arrayNames)/sizeof(arrayNames[0]);
    int namesRand = rand() % size;

    printf("Please enter your name: ");
    scanf("%s", &x[0]);
    int i;

    for(i = 0; i < size; i++)
    {
        if(strcmp(x, arrayNames[i] == 0));
        {
            printf("Hello %s, your orientation is: %s", x, arrayOrient[namesRand]);
        break;
        }
        else
        {
            printf("Invalid name!");
        }
    }
    return 0;
}

strcmp(); を使用する際のヒント。歓迎されます。

4

5 に答える 5

5

セミコロンを削除する必要があると思います。if then ステートメントにセミコロンは必要ありません。

于 2013-08-25T00:26:18.627 に答える
2

構文エラーがあります。その行次のとおりです。

if(strcmp(x, arrayNames[i]) == 0)

arrayNames[i]" "? の後に必要な余分な ")" を参照してください。strcmp は 2 つの引数を比較し、2 つの文字列が同じ場合は "0" を返します。

);"if" 行の末尾にある余分な " " (親と不要なセミコロン) を削除します。

于 2013-08-25T00:28:45.557 に答える
0

Zaibis と Dauterman と Hot Licks が正しいです。プラス: 1. printf の末尾に改行を追加しました。「\n」です。2.さらに、このマクロはあなたの人生を楽にします:

#define strEQ(a,b) (0 == strcmp((a),(b)))

...
if(strEQ(x, arrayNames[i]) {
    printf("Hello %s, your orientation is: %s\n", x, arrayOrient[namesRand]);
    break;
} else {
    printf("Invalid name!\n");
}

これはかなり奇妙なプログラムで、ユーザーは名前を推測できますが、性的指向は選択できません! そして、3 つの名前のどれが受け入れられるかをどうやって知ることになっているのでしょうか?

また、ここに潜在的なバグがあります:
arrayOrient[namesRand]
数 namesRand が、arrayOrient の長さではなく、もう一方の配列 arrayNames の長さを使用して選択されたということです。

于 2013-08-25T00:59:14.367 に答える
0

コードがコンパイルされない理由は、これが完全なステートメントであるためです

if(strcmp(x, arrayNames[i] == 0))
    ; // If the strings are the same, do an empty expression.

明らかに、ステートメントは次のようになります。

if(0 == strcmp(x, arrayNames[i]))

これで、if のない else を含むコード ブロックができました。したがって、コンパイラは文句を言います。

{
} else // This else doesn't match the if, the if is a single-line statement.

これを試して:

if(0 == (strcmp(x, arrayNames[i])))
{
    printf("Hello %s, your orientation is: %s", x, arrayOrient[namesRand]);
    break;
}
else {
        printf("Invalid name!");
    }
}
于 2013-08-25T00:27:28.350 に答える
0

ifこの場合のようにステートメントの後ろにセミコロンを置くと:

(他の人がセミコロンの使用を明確にしたいだけなので、間違って配置されたブレースについて言及しているのではありません)

if(strcmp(x, arrayNames[i] == 0));
{
    printf("Hello %s, your orientation is: %s", x, arrayOrient[namesRand]);
    break;
        }
    else {
        printf("Invalid name!");
    }
}

標準では、ジャンプ ステートメント (ループまたは if ステートメントとして) に括弧を配置しない場合、スコープは次の式だけになります。

つまり、ifステートメントはセミコロンを参照して;います。つまり、ステートメントが真の場合、何も実行されません。セミコロンに関連付けられた式がないため、ステートメントは既に呼び出されており、包含されたスコープはifステートメントに依存せずに実行されます。

于 2013-08-25T00:32:05.707 に答える