-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.out 50q.zrL5e0Sak”(不带引号)时。但是,如果我对 crypt 使用任何其他输入,则代码似乎会失败。另一个密码:加密密码的例子是 abaca:50TZxhJSbeG1I。abaca 一词出现在列表中,但无法识别。我无法修复此代码以适用于所有输入。

4

1 回答 1

1

将以下代码段添加到while (fgets...)正文的开头:

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

读取的缓冲区末尾通常有一个换行符\n(读取时)fgets

您的原始代码适用,"password"因为crypt. 它也适用于长度为 8 或更长的任何单词。

此外,通过在格式字符串中添加换行符或(如果您不想输出额外的换行符)调用,确保在打印结果后刷新输出fflush(stdout)

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