char i,j,k,l;
if(argc==2)
{
char a[5]="\0";
for(i='a';i<='z';i++)
{
a[0]=i;
printf("%s\n",a);
if(strcmp(crypt(a,"50"),argv[1])==0)
{
printf("%s\n", a);
break;
}
else{
for(j='a';j<='z';j++)
{
a[1]=j;
if(strcmp(crypt(a,"50"), argv[1])==0)
{
printf("%s\n", a);
break;
}
else
{
for(k='a';k<='z';k++)
{
a[2]=k;
if(strcmp(crypt(a,"50"), argv[1])==0)
{
printf("%s\n", a);
break;
}
else
{
for(l='a';l<='z';l++)
{
a[3]=l;
if(strcmp(crypt(a,"50"), argv[1])==0)
{
printf("%s\n", a);
break;
}
}
}
}
}
}
}
}
代码的主要部分是创建一组单字符,双字符,三字母和四字母字符串,然后检查散列代码中的加密哈希值,这些哈希代码作为输入传递 散列由c
提供的crypt函数完成要检查原始程序中的错误,我使用了printf行
printf("%s\n", a);
我预期的输出是
a
b
c
d
e
(...)
但输出是:
azzz
bzzz
czzz
dzzz
(...)
许多人告诉我在最里面的循环中使用printf行但是它也不会改变我的程序无法生成单个,双重三个字符集的原始错误。它只能创建一个四字符串。
答案 0 :(得分:1)
你最有可能从内循环中得到剩饭。因此,当外环到达b时,[1] .. a [3]仍然具有&#39; z&#39;他们的性格。简单的解决方案是做类似的事情:
a[0]=i;
a[1]=0;
但我会完全简化循环并按照这样做:
const char END[]="zzzz"; // any word, e.g. END[]="end";
char a[sizeof(END)/sizeof(*END)]=""; // 4 chars + 1 '\0'
do{
// increment a
for(int i=0;i<(sizeof(a)/sizeof(*a)-1);i++){
if(a[i]=='z'){a[i]='a';}
else {
if(a[i]) a[i]+=1;
else a[i]='a';
break;
}
}
if(strcmp(crypt(a, "50"), argv[1])==0){
printf("%s\n", a);
break;
}
} while(strcmp(a, END)); // finish on a == END
不是最优雅的解决方案,但应该有效。我会让你填写其余部分。
祝你好运。奖励编辑:通过添加const up top使代码更容易配置。