c-malloc()转换为修改字符串的递归函数



代码 :

此代码的目的是获取一个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偏见"(,通常我会使用malloc((来解决这个问题,但我不知道如何在函数内部使用来修改字符串。

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

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

当只有一个*时,就会出现基本情况,在这种情况下,将*替换为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);
}

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

最新更新