-1

私はCでcrypt関数を使用しています。ここでは、コマンドライン入力に暗号化された単語を入力しています。/ usr / share / dict / words内の単語を使用し、crypt関数を使用して暗号化してから、crypt関数の暗号化された出力をコマンドライン入力と比較します。単語が同じ場合は、printfステートメントを使用して、暗号化されていないコードを出力として出力します。コードを以下に示します。

    #include<stdio.h>
    #define _XOPEN_SOURCE
    #include<unistd.h>
    #include<cs50.h>
    #include<string.h>
    int
    main(int argc, string argv[]){
    char line[80];
    string crypto;
    if(argc>2||argc<2)
     {
     printf("ERROR. Enter only one crypt");
     return 1;
     }
    string crypti=argv[1];
    FILE *fr;
    string as;
    fr=fopen("/usr/share/dict/words","r");
    if(!fr)
        {
      printf("File can't be read");
      exit(-1);
        }
    while(fgets(line,80,fr)!=NULL)
      {
      as=crypt(line,"50");
      if(strcmp(as,crypti)==0)
       {
     printf("%s",line);
      break;
       }
       }
    fclose(fr);
   }

コードは、1つの入力、つまり「./a.out50q.zrL5e0Sak」(引用符なし)を指定した場合にのみ正常に機能するようです。ただし、暗号化に他の入力を使用すると、コードが失敗するようです。password:encrypted passwordの別の例は、abaca:50TZxhJSbeG1Iです。アバカという単語がリストに含まれていますが、識別できません。このコードをすべての入力で機能するように修正することはできません。

4

1 に答える 1

1

while (fgets...)bodyの先頭に次のスニペットを追加します。

  size_t len = strlen(line);
  if (len)
    line[len-1]='\0';

\nによって読み取られるバッファの最後には通常、(読み取られたときの)改行がありますfgets

"password"で実際に使用されるのはキーの最初の 8 文字のみであるため、元のコードは で機能しcryptます。長さが 8 以上の任意の単語でも機能します。

また、フォーマット文字列に改行を追加するか、(余分な改行を出力したくない場合) を呼び出して、結果を出力した後に出力がフラッシュされることを確認してくださいfflush(stdout)

printf("%s\n",line);
/* or */
printf("%s",line);
fflush(stdout);
于 2013-01-28T06:06:32.500 に答える