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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (81)

试图在这里学习一些东西而不是解决具体问题。请帮助我在这种情况下应用一些最佳实践,并在可能的情况下澄清原因。提前感谢你的帮助。

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

这是函数的代码,为了清楚起见,附加注释:

//'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

从一点点我记得指针,我猜它是传递引用而不是值的东西,但我没有足够的知识来解决它。我已经阅读了这个帖子,但是这个建议似乎没有解决问题 - 我尝试使用strcpy并得到了相同的结果。

免责声明:这是哈佛大学在EDX的2018年CS50演习。它不会影响我的评分(已经提交了一周的两个完美的练习,这是必要的)但如上所述,我正在学习。

编辑:将标签编辑回C(正如注释中所阐明的那样,字符串来自string.h,并且追加由我编码并经过多次验证 - 我将在一段时间内进入TDD)。谢谢大家的意见; 问题解决了,经验教训!

提问于
用户回答回答于

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

当代码命中时:

strcmp(hash,force)==0

然后你将'test'指向的字符串分配给'破解':

cracked = test;

然后这一行被击中:

if(cracked){break;}

然后循环被打破,下一行:

free(test);

这行将释放test指向的字符串,并记住它是'cracked'指向的相同字符串,因此您返回了一个已经释放的字符串

字符串会发生什么取决于您的编译器和libc。你可以尝试通过为'破解'分配内存来解决这个问题:

cracked = strdup(test);

此外,由'test'和'force'字符串引起的内存泄漏,但它们应该与您的问题无关。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励