【问题标题】:Print strings of length of k from a and b从 a 和 b 打印长度为 k 的字符串
【发布时间】:2020-01-07 16:33:02
【问题描述】:

我想写一个程序,它可以打印所有可能的长度为 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;
}

【问题讨论】:

  • 字符串连接运算符 (+) 在 C 中不起作用!声明时必须知道长度并使用strcat
  • s/does not work/does not exist/
  • 我记得在我第一份工作的第一天,我问我的团队“C 中的字符串连接运算符是什么?”每个人都笑了。永远不要忘记。 :D
  • "我的代码不工作。" 为什么不呢?它有什么作用?这是怎么回事?
  • 当问题陈述很简单时,很难提供解决方案,"it doesn't work"。请edit您的问题更完整地描述您预期会发生什么以及这与实际结果有何不同。请参阅 How to Ask 以获取有关什么是好的解释的提示。

标签: c


【解决方案1】:

您的代码假定 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';

您的其余代码都很好;通过这一更改,您的代码将产生您预期的结果 (demo)。

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

【讨论】:

    【解决方案2】:

    我写了一个 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;
    }
    

    示例输出:

    Success #stdin #stdout 0s 4256KB
    aaa
    aab
    aba
    abb
    baa
    bab
    bba
    bbb
    

    【讨论】:

    • 这是一个替代代码,但你不要告诉 OP 出了什么问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多