【问题标题】:Error in generating a four letter character array生成四字母字符数组时出错
【发布时间】:2017-12-20 23:58:45
【问题描述】:
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 行,但它也不会改变原来的错误,即我的程序将无法生成一组单字符、双字符和三字符集。它将只能创建一个四个字符的字符串。

【问题讨论】:

  • 尝试更改这一行:char a[5]="\0";char a[5] = {0};
  • @ErikW 这些初始化相同。
  • 用独特的输出替换各种printf("%s\n", a);,以帮助澄清看到的输出。 printf("1 &lt;%s&gt;\n", a);printf("2 &lt;%s&gt;\n", a); ...
  • 张贴crypt() 会有所帮助。

标签: c arrays string character


【解决方案1】:

您很可能从内部循环中得到剩余物。因此,当外部循环到达 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

不是最优雅的解决方案,但应该可以。剩下的就交给你了。

祝你好运。

额外修改:通过在顶部添加 const 使代码更易于配置。

【讨论】:

  • 感谢@MultiSkill,我得到的结果是它们可能是内部循环的剩余部分,但是当外部循环第一次执行时,它必须打印与单个循环相同的情况简单地作为 a b c .... 然后在外部循环将 i 的值切换为 'b' 的完整执行之后它应该给 azzz bzzz czzz .... 我还是有点困惑你能澄清一下吗在那?
  • @user8590061 这是我在没有 crypt 函数的情况下运行代码时得到的输出:
  • 你能给出输出吗?
  • @user8590061 这是我在没有 crypt 函数的情况下运行您的代码时得到的输出:a bzzz czzz dzzz ... zzzz 所以正如提到的剩余字符在那里。不过,不知道你从哪里得到的 azzz。就像一些评论者提到的那样:尝试添加一个标签以了解该行来自哪个 printf 。我也测试了我的解决方案,结果是: a b c d ... z aa ba ca .. za ab bb cb db ... zzzz
猜你喜欢
  • 2017-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
相关资源
最近更新 更多