在C中使用crypt函数时出错了

时间:2013-01-28 05:48:16

标签: c encryption cs50

我在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存在于列表中但未能识别。我无法修复此代码以适用于所有输入。

1 个答案:

答案 0 :(得分:1)

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

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

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

您的原始代码适用于"password",因为crypt实际上只使用了密钥的8个第一个字符。它适用于任何长度为8或更长的单词。

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

printf("%s\n",line);
/* or */
printf("%s",line);
fflush(stdout);