如何在C中递归返回字符串值?

如何在C中递归返回字符串值?,c,string,recursion,cs50,C,String,Recursion,Cs50,试图在这里学到一些东西,而不是解决具体问题。请帮助我了解一些适用于这种情况的最佳实践,如果可能,请澄清原因。提前感谢您的帮助 基本上,我是在已知的范围内,强力破解一个非常简单的散列算法。函数根据散列测试字符串(在长度限制内)的可能性,直到它与传递的散列匹配。然后递归应该停止所有迭代并返回匹配的字符串。迭代是可行的,但当找到答案时,函数的每次运行似乎都不会得到调用同一函数返回的值 以下是该函数的代码,为清晰起见,添加了额外注释: //'hash' is the hash to be replica

试图在这里学到一些东西,而不是解决具体问题。请帮助我了解一些适用于这种情况的最佳实践,如果可能,请澄清原因。提前感谢您的帮助

基本上,我是在已知的范围内,强力破解一个非常简单的散列算法。函数根据散列测试字符串(在长度限制内)的可能性,直到它与传递的散列匹配。然后递归应该停止所有迭代并返回匹配的字符串。迭代是可行的,但当找到答案时,函数的每次运行似乎都不会得到调用同一函数返回的值

以下是该函数的代码,为清晰起见,添加了额外注释:

//'hash' is the hash to be replicated
//'leading' is for recursive iteration (1st call should have leading=="")
//'limit' is the maximum string length to be tested

string crack(string hash, string leading, int limit)
{
    string cracked=NULL, force=NULL, test=NULL;

    //as per definition of C's crypt function - validated
    char salt[3] = {hash[0], hash[1], '\0'};

    // iterate letters of the alphabet - validated
    for(char c='A'; c<='z'; c++)
    {
        // append c at the end of string 'leading' - validated
        test = append(leading,c);

        // apply hash function to tested string - validated
        force = crypt(test,salt);

        // if hash replicated, store answer in 'cracked' - validated
        if(strcmp(hash,force)==0)
        {
            cracked = test;
        }
        else
        {
            // if within length limit, iterate next character - validated
            if(strlen(test)<=limit+1)
            {
                // THIS IS WHERE THE PROBLEM OCCURS
                // value received when solution found
                // is always empty string ("", not NULL)
                // tried replacing this with strcpy, same result
                cracked = crack_des(hash,test,limit);
            }
        }

        // if answer found, break out of loop - validated
        if(cracked){break;}

        // test only alphabetic characters - validated
        if(c=='Z'){c='a' - 1;}
    }

    free(test);

    // return NULL if not cracked to continue iteration on level below
    // this has something to do with the problem
    return cracked;
} // end of function
/“hash”是要复制的哈希
//“leading”用于递归迭代(第一次调用的leading==“”)
//“limit”是要测试的最大字符串长度
字符串破解(字符串哈希、字符串前导、整数限制)
{
字符串=空,力=空,测试=空;
//根据C的crypt函数定义-已验证
char salt[3]={hash[0],hash[1],'\0'};
//迭代字母表中的字母-已验证

对于(char c='A';c,我在代码中发现了一个bug,但我不确定这是否是问题的根本原因

当代码出现问题时:

strcmp(hash,force)==0
然后将“test”指向的字符串指定给“cracked”:

cracked = test;
cracked = strdup(test);
然后点击这一行:

if(cracked){break;}
然后断开循环,下一行:

free(test);
这一行将释放test所指向的字符串,并且记住它与'cracked'所指向的字符串相同,因此返回了一个已经释放的字符串

字符串将发生什么情况取决于编译器和libc。您可以尝试通过为“cracked”分配内存来解决此问题:

cracked = test;
cracked = strdup(test);

此外,“test”和“force”字符串也会导致内存泄漏,但它们应该与您的问题无关。

我在代码中发现了一个bug,但我不确定这是否是您问题的根本原因

当代码出现问题时:

strcmp(hash,force)==0
然后将“test”指向的字符串指定给“cracked”:

cracked = test;
cracked = strdup(test);
然后点击这一行:

if(cracked){break;}
然后断开循环,下一行:

free(test);
这一行将释放test所指向的字符串,并且记住它与'cracked'所指向的字符串相同,因此返回了一个已经释放的字符串

字符串将发生什么情况取决于编译器和libc。您可以尝试通过为“cracked”分配内存来解决此问题:

cracked = test;
cracked = strdup(test);


还有,因为“测试”和“力”字符串引起内存泄漏,但是应该与您的问题无关。< /P>在我没有查看时有人向C添加字符串类型吗?还是,是Car *的Type?C++?C.中没有<代码>字符串< /代码>…而且据我所知,在<代码> Boo.(破解){断句;}如果意图是C++,则是可疑的。代码中的所有内容似乎都是一个类型化的。将<代码> C++ <代码>标签改为<代码> C++ >代码>。< /Cord>方法不是C++方法。它是C++方法。修复提交,以便在其中有递归函数。它也有助于知道<代码>字符串和<代码>附录< /C>。是否有人在我不查看时添加字符串类型给C?或者是char *的Type??据我所知,在C++中,没有一个运算符在代码< BoOL 上下文中转换,所以,如果代码是“C++”,则代码< >(破解){ } /C++。< /Cord>方法不是C方法。它是一个C++方法。在其中固定一个递归函数,这样就可以知道代码< >字符串和<代码>附加< /COD>。你假设String是STD::String吗?如果是,则代码>破解=测试;< /Cord>做一个拷贝,而不是保持指针。但是我不明白为什么会这样。code>free(test)

用于字符串。@pranj他正在用strcmp()操作字符串,用free()释放字符串,标记是“C”而不是“C++”,所以我在回答问题时将字符串视为char*@pranj的typedef,标记仍然是“C”,现在由其他人编辑。我认为很明显,在这个问题中,作者使用strcmp/strlen/free来操作“字符串”Type是唯一合理的猜测。编辑标签到C++没有进一步确认与作者无关。@ YiZhanFi OP没有试图否认或确认他们的源代码是否是我们的信息,可以安全地假设这是一个C++帖子。我同意你的说法;标签。如果需要,将在OP陈述更多信息时再次编辑。谢谢@YiZhenfei,确实是释放
test
的问题。我以前有过一次完全执行失败,我认为这可能是由于
test
force
引起的内存泄漏,正如您提到的。您是否假设这里的string是std::string?如果然后
cracked=test;
进行复制,而不是保留指针。但我不明白为什么
free(test)
用于字符串。@Pranj他用strcmp()操作字符串,用free()释放字符串,标记是“C”而不是“C++”,所以当我回答这个问题时,我把string看作char*@pranj的typedef,标记仍然是“C”,现在它被其他人编辑了。我认为很明显,在这个问题中,作者使用strcmp/strlen/free来操作“string”TyPurfFCar是唯一合理的猜测。将标签编辑到C++中,而不与作者进一步确认是不负责任的。