生成四字母字符数组时出错

时间:2017-12-20 23:58:45

标签: c arrays string character

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行但是它也不会改变我的程序无法生成单个,双重三个字符集的原始错误。它只能创建一个四字符串。

1 个答案:

答案 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使代码更容易配置。