C 从a和b打印长度为k的字符串
我想写一个程序,它可以打印所有可能的长度为k的字符串,这些字符串可以由a和b组成 k=3的示例:aaa、baa、aba、bba、aab、bab、abb、bbb 我的代码不起作用。有人能纠正我吗?多谢各位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);
#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