C 从a和b打印长度为k的字符串

C 从a和b打印长度为k的字符串,c,C,我想写一个程序,它可以打印所有可能的长度为k的字符串,这些字符串可以由a和b组成 k=3的示例:aaa、baa、aba、bba、aab、bab、abb、bbb 我的代码不起作用。有人能纠正我吗?多谢各位 #include <stdio.h> void abcombirec(char prefix[], int k) { char ab[] = {'a', 'b'}; if (k == 0) { printf("%s\n", prefix);

我想写一个程序,它可以打印所有可能的长度为k的字符串,这些字符串可以由a和b组成

k=3的示例:aaa、baa、aba、bba、aab、bab、abb、bbb

我的代码不起作用。有人能纠正我吗?多谢各位

#include <stdio.h>

void abcombirec(char prefix[], int k) {
    char ab[] = {'a', 'b'};
    if (k == 0) {
        printf("%s\n", prefix);
        return;
    }
    for (int i = 0; i < 2; i++) {
        newprefix = prefix + ab[i];
        abcombirec(newprefix, k - 1);
    }
}

void abcombi(int k) {
    char str[] = "";
    abcombirec(str, k);
}

int main() {
    (abcombi(3));
    return 0;
}
#包括
void abcombirec(字符前缀[],int k){
字符ab[]={'a','b'};
如果(k==0){
printf(“%s\n”,前缀);
返回;
}
对于(int i=0;i<2;i++){
newprefix=前缀+ab[i];
abcombirec(新前缀,k-1);
}
}
奥维德·阿布科比(int k){
字符str[]=“”;
abcombirec(str,k);
}
int main(){
(abcombi(3));
返回0;
}
您的代码假定C“理解”运算符
+
作为串联:

newprefix = prefix + ab[i];
然而,事实并非如此:C将此表达式理解为指针算术,将
ab[i]
解释为整数偏移量

在C中将字符连接到字符串需要大量代码:

  • 分配足够长的缓冲区
  • 将前缀复制到缓冲区中
  • 将所需字符添加到末尾
  • Null终止结果
下面是代码中的外观:

size_t len = strlen(prefix);
char tmp[len+2];
strcpy(tmp, prefix);
tmp[len] = ab[i];
tmp[len+1] = '\0';
代码的其余部分很好;有了这一变化,您的代码将产生预期的结果()


注意:此代码在自动内存中分配
tmp
。考虑到代码的作用,
k
将非常小(否则代码将运行很长时间),因此自动内存中的数组分配不会成为问题。但是,使用这种方法时需要非常小心,因为如果
len
太大,很容易导致未定义的行为。您应该使用更安全的strlen版本,并在投入生产的任何场景中进行动态内存分配。

我编写了一个quick-n-dirty递归函数:

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

void showboth(char* txt, int pos)
{
    if (pos == strlen(txt)-1)
    {
        printf("%s\n", txt);
        txt[pos] = 'b';
        printf("%s\n", txt);
        txt[pos]='a';
    }
    else
    {
        showboth(txt, pos+1);
        txt[pos] = 'b';
        showboth(txt, pos+1);
        txt[pos] = 'a';
    }
}

int main(void) {
    char text[5] = "aaa";

    showboth(text, 0);
    return 0;
}

字符串连接运算符(
+
)在C中不起作用!你必须在声明它时知道长度,并使用类似于
strcat
s/不工作/不存在/我记得在我第一次工作的第一天,我问我的团队“C中的字符串连接运算符是什么?”大家都笑了。永远不要忘记“我的代码不起作用。”为什么不呢?它有什么作用?这是怎么回事?当问题陈述只是简单的,很难提供解决方案。请你的问题更完整地描述一下你预期会发生什么,以及这与实际结果有什么不同。请参阅以获取关于什么是好的解释的提示。这是一个替代代码,但您不会告诉OP出了什么问题。
Success #stdin #stdout 0s 4256KB
aaa
aab
aba
abb
baa
bab
bba
bbb