225

ユーザーが単語または文字を入力して保存し、ユーザーが再度入力してプログラムを終了するまで印刷するプログラムを取得しようとしています。私のコードは次のようになります。

#include <stdio.h>

int main()
{
    char input[40];
    char check[40];
    int i=0;
    printf("Hello!\nPlease enter a word or character:\n");
    gets(input);   /* obsolete function: do not use!! */
    printf("I will now repeat this until you type it back to me.\n");

    while (check != input)
    {
        printf("%s\n", input);
        gets(check);   /* obsolete function: do not use!! */
    }

    printf("Good bye!");
    

    return 0;
}

問題は、ユーザーによる入力 (チェック) が元の (入力) と一致している場合でも、入力文字列の出力を取得し続けることです。2つを間違って比較していますか?

4

10 に答える 10

335

!=またはを使用して文字列を (便利に) 比較することはできません。==使用する必要がありますstrcmp

while (strcmp(check,input) != 0)

これは、!===がこれらの文字列のベース アドレスのみを比較するためです。文字列自体の内容ではありません。

于 2011-11-04T02:24:16.837 に答える
38

いくつかのことを確認してください:getsは安全fgets(input, sizeof(input), stdin)ではないため、バッファ オーバーフローが発生しないように置き換える必要があります。

次に、文字列を比較するには、 を使用する必要がありますstrcmp。戻り値 0 は、2 つの文字列が一致することを示します。等値演算子 (ie. !=) を使用すると、2 つの文字列のアドレスが比較され、文字列内の個々charの が比較されます。

また、この例では問題は発生しませんが、バッファにもfgets改行文字を格納することに注意してください。ではない。からのユーザー入力を文字列リテラルと比較した場合、決して一致しません (バッファーが小さすぎてが収まらない場合を除きます)。'\n'gets()fgets()"abc"'\n'

于 2011-11-04T02:29:51.517 に答える
9

このように配列を直接比較することはできません

array1==array2

文字ごとに比較する必要があります。このために、関数を使用してブール値 (True:1, False:0) を返すことができます。その後、while ループのテスト条件で使用できます。

これを試して:

#include <stdio.h>
int checker(char input[],char check[]);
int main()
{
    char input[40];
    char check[40];
    int i=0;
    printf("Hello!\nPlease enter a word or character:\n");
    scanf("%s",input);
    printf("I will now repeat this until you type it back to me.\n");
    scanf("%s",check);

    while (!checker(input,check))
    {
        printf("%s\n", input);
        scanf("%s",check);
    }

    printf("Good bye!");

    return 0;
}

int checker(char input[],char check[])
{
    int i,result=1;
    for(i=0; input[i]!='\0' || check[i]!='\0'; i++) {
        if(input[i] != check[i]) {
            result=0;
            break;
        }
    }
    return result;
}
于 2015-04-06T09:46:49.533 に答える