c - For循环在C中递归排列字符串时会产生错误
问题描述
我是 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: error: control may reach end of non-void function [-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
在循环体内有一个无条件语句不是一个错误吗?这使得循环非常无用。
推荐阅读
- docker - 如何根据计数将所有容器的主机名添加到 nginx 上游
- r - 旋转设备区域外边缘的文本
- html - r markdown:数据框(或data.table)超出页面
- javascript - from openpyxl.chart.title import Title - AttributeError: 'list' object has no attribute
- r - 将数据帧的子集从字符转换为数字
- javascript - 为什么 event.preventDefault() 不适用于使用 jquery 加载的 html 元素
- qt - 树视图的 currentChanged 信号不调用槽函数
- android - 如何在Android中返回值之前确保侦听器已完成
- mongodb - 为单机 MongoDB 设置分发 MongoDB 后台索引创建
- scala - 为案例类自动生成案例对象