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