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 行,但它也不会改变原来的错误,即我的程序将无法生成一组单字符、双字符和三字符。它将只能创建一个四字符的字符串。
最佳答案
您很可能是从内部循环中得到剩余的。所以当外层循环到达 b 时,a[1]..a[3] 中仍然有 'z' 字符。简单的解决方案是做类似的事情:
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
这不是最优雅的解决方案,但应该可行。我会留给你填写其余部分。
祝你好运。
额外的修改:通过在顶部添加常量使代码更易于配置。
关于c - 生成四字母字符数组时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47916024/