gpt4 book ai didi

c - 在 C 中递归排列字符串时,For 循环会产生错误

转载 作者:行者123 更新时间:2023-11-30 14:42:42 25 4
gpt4 key购买 nike

我是 C 新手,正在尝试编写一个函数,该函数使用递归返回字符串大小为 k 的子集的所有排列。例如,对于字符串“abc”且 k = 1,我会得到“a”、“b”和“c”,对于 k = 2,我会得到“aa”、“ab”、“ac”、“ba” '、'bb'、'bc'、'ca'、'cb' 和 'cc' 等。

我想返回所有生成的字符串,以便我可以用它们做其他事情 - 现在它只是将它们打印出来,但我稍后会使用它们。我写了这段代码:

#include <stdio.h>
#include <string.h>

#define CHARS "abc"

char *recur(char* prefix, int k, int n);

int main(void)
{
int k = 2; //for example
int n = strlen(CHARS); //set n as length of CHARS
//print string generated by recur
printf("string: %s\n", recur("", k, n));
}

char *recur(char *prefix, int k, int n)
{
//if base case (have already added all letters), return string
if (k == 0)
{
return prefix;
}
//otherwise, add character from CHARS to string
else
{
for (int i = 0; i < n; i++)
{
// for each letter in CHARS, make a new prefix and add a letter from chars to it
int prefLen = strlen(prefix);
char newPrefix[prefLen + 2];
strcpy(newPrefix, prefix);
newPrefix[prefLen] = CHARS[i];
newPrefix[prefLen + 1] = '\0';
return recur(newPrefix, k-1, n);
}
}
}

但是,我收到错误 'recur1.c:40:1: 错误:控制可能到达非 void 函数的末尾 [-Werror,-Wreturn-type]' 尝试编译时。

为了进一步探索这一点,我删除了 for 循环,该循环会产生反转的字符串:

char *recur(char *prefix, int k, int n)
{
//if base case (have already added all letters), return string
if (k == 0)
{
return prefix;
}
//otherwise, add character from CHARS to string
else
{
//make a new array called newPrefix, copy current prefix into it and add new letter from CHARS
int prefLen = strlen(prefix);
char newPrefix[prefLen + 2];
strcpy(newPrefix, prefix);
newPrefix[prefLen] = CHARS[k-1];
newPrefix[prefLen + 1] = '\0';
return recur(newPrefix, k-1, n);
}
}

替换第二个函数后,代码编译没有任何问题。关于为什么带有 for 循环的版本无法编译有什么想法吗?

最佳答案

如果n <= 0 ,然后 for永远不会进入循环,因此 return永远不会到达循环体中的语句。因为没有return循环后的语句,编译器会提示(这是正确的)。

也就是说:你确定无条件 return 不是一个错误吗?循环体内的语句?这使得循环变得毫无用处。

关于c - 在 C 中递归排列字符串时,For 循环会产生错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54349045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com