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

标签 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 行,但它也不会改变原来的错误,即我的程序将无法生成一组单字符、双字符和三字符。它将只能创建一个四字符的字符串。

最佳答案

您很可能是从内部循环中得到剩余的。所以当外层循环到达 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/

相关文章:

c - 为什么在整数变量中输入浮点值会给我一个奇怪的答案?

c++ - math.h 即使包含在 makefile 中也不被包含

c++ - C/C++ 跨平台库允许利用 GPU 进行浮点计算

c - 移动内存页面的方法比 mremap() 更快?

c - 我如何使用指针在该数组(函数)内部移动而不是数组订阅

java - 如何在JAVA中读取文本文档中的值,然后将它们解析为整数

c - C 中的二维数组是否需要使所有元素连续?

c - 甚至以向后方式排列数组的字符串

c++ - getline() 可以用于从 fstream 获取 char 数组吗

swift - 用另一个字符串替换一个字符串