我正在研究这个问题:http://d2o9nyf4hwsci4.cloudfront.net/2014/spring/psets/2/hacker2/hacker2.html
我试图从/ usr / share / dict / words中列出加密的8个字母的单词,这是我到目前为止所得到的。我正在使用盐HA和50。
#define _XOPEN_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int FindWord();
int main(int argc, char *argv[])
{
if(argc > 2)
{
printf("Invalid Argument");
return 1;
}
else
{
FindWord();
}
int FindWord()
{
FILE *fp1, *fp2;
fp1 = fopen("/usr/share/dict/words", "r");
fp2 = fopen("EncrpytedPassword.txt","a+");
char *Line = fgets(char *line[9], int 9, fp1);
while (fgets(char *line[9], int 9, fp1) != EOF)
{
char *EncryptLine1 = crypt(Line, const char *50);
fputs(EncryptLine1, fp2);
char *EncryptLine2 = crypt(Line, const char *"HA");
fputs(EncryptLine2, fp2);
}
}
**crack.c:26:24: error: expected expression
char *Line = fgets(char *line[9], int 9, fp1);
^
crack.c:27:18: error: expected expression
while (fgets(char *line[9], int 9, fp1) != EOF)
^
crack.c:29:43: error: expected expression
char *EncryptLine1 = crypt(Line, const char *50);
^
crack.c:31:43: error: expected expression
char *EncryptLine2 = crypt(Line, const char *"HA");
**
答案 0 :(得分:0)
您的代码中存在一些问题:
false:
char *Line = fgets(char *line[9], int 9, fp1);
正确:
char line[9];
fgets(line, 9, fp1);
为什么:
char *Line = fgets(char *line[9], int 9, fp1);
while (fgets(char *line[9], int 9, fp1) != EOF)
不是吗? :
char line[9];
while (fgets(line, 9, fp1) != NULL)
另外,你的word文件长139719行。你确定要这么做吗?
错误:
char *EncryptLine1 = crypt(Line, const char *50);
是的:
char *EncryptLine1 = crypt(Line, "50");
使用-lcrypt更正此编译并且包含良好的包含且没有&#34;期望的表达式&#34;
(写&#34; \ n&#34;文件中的每个哈希值都很棒之后)
请注意,在函数开头声明EncryptLine1和EncryptLine2会更清楚。
答案 1 :(得分:0)
我完全不确定究竟是什么问题,但假设在给出的代码中存在一些问题,并且假设正在询问解决问题的航点:代码中缺少打开和关闭的类型转换括号。
line
在您向我们披露的情况下不存在。您似乎尝试使用fgets
的方式确实非常规,但以下方法可行:
char *Line = fgets((char[9]) { 0 }, (int) 9, fp1);
而不是你写的。在那里,{ 0 }
将被转换为9
个字符数组,动态分配内存直到该范围结束,然后将其作为参数发送到fgets
。然后,Line
将接收该动态分配的内存位置的地址,因为fgets
返回其第一个参数,除非发生错误。
我希望我可以提供我依赖的文件,以确保在该范围结束之前该内存位置可用。
我不知道你在(const char *) 50
尝试过什么,但它不会起作用。如果您希望将带有ASCII代码50
的单个字符作为字符串传递,那么您可以在那里编写(const char[]) { 50, 0 }
。或者更确切地说(const char *) "50"
如果您想使用字符串"50"
。