2017-12-08 32 views
1

ユーザーの入力が既に指定された文字列と等しいかどうかを確認するコードを記述しています。プログラムは、strcmp関数を使用して入力が文字列と同じになるまでループしますが、何らかの理由でプログラムが文字列を比較しないため、ループが誤動作します。コードは以下である:ループ内のCで2つの文字列を比較する

int main() 
{ 
    char passcode[3]="ZZZ"; 
    char input[3]; 
    int check; 
    while(check!=0) 
     { 
     printf("What is the password?\n"); 
     gets(input); 
     check=strcmp(passcode, input); 
     } 
    printf("You crack the pass code!"); 
    return 0; 
} 
+1

ゼロ以外の値で 'check'を初期化する必要があります。 – abdullah

+2

'strcmp(パスコード、入力)'は2つの文字列を必要とします。 'passcode []'はヌル文字がないので文字列ではありません。 – chux

+1

['gets()'は使用するにはあまりにも危険です! 2文字は安全に入力することができます。これは遠く離れていても遠すぎず、リモートから安全ではありません。 3を4096に変更してください。 –

答えて

2

主な問題はここにある:

char passcode[3]="ZZZ"; 
char input[3]; 

Cの文字列はヌルバイトに続く文字の配列からなります。 passcodeは、初期化された文字列のnullバイトを保持するのに十分な大きさではありません。したがって、文字列としてstrcmpに渡して使用しようとすると、配列の最後を読み取ることになります。これにより、undefined behaviorが呼び出されます。

同様に、inputは、比較するのに十分な大きさの文字列を保持するのに十分なほど大きくありません。

checkも初期化されていないので、初めてループを入力するときの値は不明です。

もう1つの問題は、getsの使用です。この関数は、ユーザーが入力した文字列が指定されたバッファに収まるかどうかをチェックしないため、危険です。 isが大きすぎる場合、これは未定義の動作を再度呼び出します。

ユーザーの入力とターゲット文字列を保持するように配列を大きくし、getsの代わりにfgetsを使用します。また、ループを少なくとも1回入力する必要があるため、whileループをdo..whileに変更する必要があります。

#include <stdio.h> 

int main() 
{ 
    char passcode[]="ZZZ"; // array is automatically sized 
    char input[50]; 
    int check; 

    do { 
     printf("What is the password?\n"); 
     fgets(input, sizeof(input), stdin); 
     check=strcmp(passcode, input); 
    } while (check!=0); 
    printf("You crack the pass code!"); 
    return 0; 
} 
+0

私はあなたの答えが気に入っています。あなたは何が間違っているかを教えてくれるだけでなく、それを修正する方法と、将来問題を避ける方法を教えてくれました。 – user1683793

+0

OPにはうまくいかないでしょうが、 'input [] 'は確かに'' \ n''を含んでいます。おそらく 'パスコード[strcspn(passcose、" \ n "] = '\ 0';'? – chux

0

私は何が起こっているかを見ています。あなたの入力文字列は3つの3バイトだけであり、あなたは安全でない取得を使って読んでいます。取得は期待どおり入力変数にZZZの入力を入れていますが、パスコードの最初のバイトに終端のヌルを入れています。

入力バッファのサイズを999に変更すると、作業が大幅に改善されます。

1

上記の推奨コードは入力を認識しません。それはおそらく動作しませんし、whileループ内でスタックします。あなたがstrcmpで行ったのと同じように、入力に対してscanfを使用して文字列を比較する方がはるかに簡単にすることをお勧めします。入力が正しければ、letループを抜けてwhileループから抜け出す。これを試してください:

#include <stdio.h> 
int main() 
{ 
    char input[3]; 
    printf ("\nHit the pass code!\npass code: "); 
    while (input != "ZZZ") { 
    scanf ("%s",&input); 
    if (strcmp(input, "ZZZ") == 0){ 
     printf ("\nYou crack the pass code!!\n\n"); 
     break; 
    } else { 
     printf ("Wroooong!\n pass code: "); 
    } 
    } 
    return 0; 
}