【问题标题】:malloc() into a recursive function that modifies a stringmalloc() 变成一个修改字符串的递归函数
【发布时间】:2020-12-02 17:26:18
【问题描述】:

代码

这段代码的目的是获取一个由 0 1 和 * 组成的字符串,并打印获得的所有字符串组合,将 * 替换为 0 或 1。 例如。

输入:0*1 => 输出:001 011

这个想法是构建一个递归函数(用于练习目的):

void rec_print (char *mod_str)

计算 * 的出现次数,循环字符串时遇到的第一个 * 的偏移量(我用三进制只是为了练习它们

for(int i=0; mod_str[i]; i++)       {
    n_star = (mod_str[i] == '*') ? n_star+1 : n_star; 
    if (offset==-1) {
        offset = (mod_str[i] == '*') ? i : -1;
    }
}

基本情况在只有一个 * 时发生,在这种情况下将 * 替换为 0,打印字符串,将 0 替换为 1,最后打印字符串:

if (n_star==1)                      {

    mod_str[offset] = "0";
    printf("\n%s", mod_str);
    
    mod_str[offset] = "1";
    printf("\n%s", mod_str);
}

否则将字符串的第一个*修改为0然后调用自身,返回时修改为1,最后调用自身:

else                                {

    // replace the first encountered * to 0 and recall itself

    mod_str[offset] = "0";
    rec_print(mod_str);

    // replace the previous 0 to 1 and recall itself

    mod_str[offset] = "1";
    rec_print(mod_str);


}

问题

你会注意到这里的问题是我正在尝试修改一个字符串哪个内存是只读的(是的,我有一个巨大的“Python偏见”这里),通常我会使用 ma​​lloc() 来解决这个问题,但我不知道如何在函数中使用它 strong> 修改字符串。

我很清楚递归不是这个练习的最佳解决方案,但我需要满足我对此的好奇心。

感谢大家在这里度过的时间,并提前为我最终的英语错误道歉。

【问题讨论】:

  • 据我了解,您的所有功能都是就地修改。为什么需要在其中动态分配任何东西?
  • 我们可以注意到许多其他问题,但不是只读内存的问题。没有足够的代码来查看这个特定问题。请发帖minimal reproducible example

标签: c recursion malloc


【解决方案1】:

当只有一个 * 时发生基本情况,在这种情况下将 * 替换为 0,打印字符串,将 0 替换为 1,最后打印字符串:

这个基本情况并不是真正的“基本情况”。例如,您可以接收字符串“001”作为输入,其中包含零颗星。您应该修改您的基本案例以仅处理零星,并依靠您的递归案例来简化从一星到零星的案例。

您会注意到这里的问题是我正在尝试修改内存为只读的字符串

如果内存是只读的,你应该向编译器澄清这个事实!然后编译器可以检查你的代码以确保它永远不会写入只读变量。

例子:

void rec_print (const char *mod_str)

您会注意到这里的问题是我正在尝试修改内存为只读的字符串(是的,我在这里有一个巨大的“Python 偏差”),通常我会使用 malloc() 来解决这个问题但我不知道如何在函数中使用它来修改字符串。

您需要将字符串复制到可以修改的地方。这是一个例子:

void rec_print (const char *src_str) { // note name change
    // Allocate memory
    char *mod_str = malloc((strlen(src_str) + 1) * sizeof(char));
    // This function copies src_str to mod_str
    strcpy(mod_str, src_str);
    // Rest of function
    ...
    // Clean up memory used
    free(mod_str);
}

这里我们分配了足够的内存来保存输入字符串。然后,我们将输入字符串复制到我们分配的空间。我们可以对这个副本进行所有修改。最后我们释放分配。

【讨论】:

    猜你喜欢
    • 2013-05-11
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    相关资源
    最近更新 更多