0

非常に単純なプログラム:

int main (void)
    {
    int i = 0, length=0;
    char password[] = SECRET;
    char guess[10];

    for (i=0; i<3; i++){
        printf( "Enter the password: " );
        fgets (guess, 10, stdin );
        length=strlen(guess);
        guess[length]='\0';
        if(strcmp( guess, password ) == 0 ){
          printf("\aYou got it right!\n" );
          return 0;
          }
          else printf("You wrote %s Incorrect guess\n\n", guess);
    }
    puts("Sorry, you're all out of guesses");

    return 0;

}

しかし、それは機能しません。

プログラムに「「黒」と思いました。申し訳ありませんが、パスワードは「黒」でした」という奇妙な状況でも、隠し文字、空白、ゴミ情報などの問題が発生している可能性があります。文字列の比較ですが、それが何であるかがわかりません!

4

2 に答える 2

5

デバッガーの使用法を学ぶと、によって返される文字列に改行文字が含まれていることがわかりfgets()ます。これは、比較対象の文字列と一致しません。

そして、このコードのポイントは何ですか:

length=strlen(guess);
guess[length]='/0';

まず第一に、私はあなたが\0の代わりに意味したと仮定することができるだけです/0。そして第二にstrlen()、ヌルターミネータを見つけることによって機能します。では、ターミネーターを見つけて、同じ場所にターミネーターを書くことのポイントは何ですか?

于 2012-12-24T21:08:41.020 に答える
1

作る代わりに:

 length = strlen(guess);
 guess[length]='\0';  

あなたはこれを作るべきです:

char *s = strchr(guess, '\n');
if (s) {  
    // new line is found  
    *s = 0;  
} else {  
    // user has exceeded max chars  
    guess[sizeof(guess) - 1] = 0;  
}  

バッファオーバーフロー攻撃を回避するために、strcmpの代わりにstrncmpを使用することをお勧めします。

于 2012-12-24T21:59:36.003 に答える