出于某种原因,我在行[i] =全部(4,4,'a','z')处得到段错误;我无法弄清楚为什么。我想把aaaa - zzzz放在一个数组和放大器中。然后将这些值逐个与加密密码进行比较。任何建议都会有帮助。谢谢。我已经给出了两个代码片段来解决这个问题。
char* all(int a, int n,char begin, char end){
int i, j;
int k = 0;
char *c = malloc((n+1)*sizeof(char));
char msg[] = "";
k = strlen(msg);
for(i = a; i <= n; i++)
{
for(j=0;j<i;j++) c[j]=begin;
c[i]=0;
do {
for(int g = 0; g < k; g++)
msg[g] = *c;
} while(inc(c,begin,end));
}
return c;
free(c);
}
int main(int argc, char* argv[])
{
char *result;
char **let;
int f = open("pass.txt", O_RDONLY);
if (f < 0)
return 0;
char buf[1024];
while (my_fgets(buf, sizeof(buf), f))
{
int i = 0;
let[i] = all(4,4,'a','z');
result = crypt(argv[i+1], buf);
i++;
int ok = strcmp (result, buf) == 0;
return ok ? 0 : 1;
}
free(let);
close(f);
}
完整的程序可以在这里找到:
答案 0 :(得分:0)
您希望let
成为(指向各个)字符串的数组。您正在为字符串分配存储空间,但不为数组本身分配存储空间。所以,要么声明:
char *let[MAX_STRINGS];
如果您在编译时已知最大字符串数,或者动态分配它:
let = malloc (sizeof (char *) * whatever_number);
在这两种情况下,您必须注意不要在输入阶段超过分配数量。如果您希望能够处理任何可能数量的输入字符串,则必须更改数据结构,可能需要更改链接列表,但我想这对您来说是一个高级主题。
另请注意,您现在在代码中拥有的free(let)
只会为阵列本身释放内存,但您还需要在此之前释放单个字符串。基本上,您必须为代码中的每个free()
执行malloc()
。