用C打印字母表中所有单词的集合

时间:2013-05-18 15:52:21

标签: c

我正在尝试编写一个程序,用于打印字母表中所有单词的集合。这主要是让我习惯于C中的字符串和指针的测试。我已经确定了一个递归解决方案,我似乎在使用strcat中的指针时遇到了麻烦。有什么建议为什么我在这里得到段错误?

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

    #define DIM 26

    void print (char *);

    char alphabet[26] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
                     'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
    char word[26];


    int main(void) {
        *word = '\0';
        print(word);
        return EXIT_SUCCESS;
    }

    void print (char *word){
        for (int i = 0; i < DIM; ++i){
            strcat(word, alphabet[i]);
            printf("%c\n", word);
            print(*word);
        }
    }

4 个答案:

答案 0 :(得分:1)

我认为最深刻的概念问题是你没有基本情况。你正在构建一个无限递归树。

试试这个:

   void print (char *word){
        if (strlen(word)<5){
             for (int i = 0; i < DIM; ++i){
               strcat(word, alphabet[i]);
               printf("%c\n", word);
               print(*word);
            }
        }
    }

使用C还有其他一些小问题,好的编译器会接受它。打开警告,不要忽略它们!

答案 1 :(得分:0)

因为1.你的缓冲区太短(26个字母,终止0,你需要27个字节),2。strcat()需要字符串,你需要它char和3你的函数有无限递归,它永远不会终止。

虚拟迭代替换解决方案:所有子集=具有重复的变体,并且有2 ^ n个子集:

char abc[26] = {
    'a', 'b', 'c', 'd',
    'e', 'f', 'g', 'h',
    'i', 'j', 'k', 'l',
    'm', 'n', 'o', 'p',
    'q', 'r', 's', 't',
    'u', 'v', 'w', 'x',
    'y', 'z'
};

for (long i = 0; i < (1 << 26); i++) {
    for (int j = 0; j < 26; j++) {
        if ((i >> j) & 1) {
            fputc(abc[j], stdout);
        }
    }
    fputc('\n', stdout);
}

欢迎你。

答案 2 :(得分:0)

  • strcat的第二个参数是字符串。所以你必须发送一个 以null结尾的char数组。
  • %c printf格式int 表示word,但char是指向{{1}}的指针。

答案 3 :(得分:0)

您需要将字长为27个字节,并将最后一个字节设置为零。

否则printf会溢出到你不拥有的内存中; printf仅在达到零字节值时终止。

您的打印功能也会无限期地调用自己。这将导致堆栈快速溢出。