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

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

c arrays string character
1个回答
1
投票

很可能你是从内循环得到剩饭。所以当外环到达b时,[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

不是最优雅的解决方案,但应该工作。我会让你填写剩下的部分。

祝好运。

奖励编辑:通过添加const up top使代码更容易配置。

© www.soinside.com 2019 - 2024. All rights reserved.