-1

我正在尝试编写一个程序来打印字母表中所有单词的集合。这主要是为了让我习惯于 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

4 回答 4

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 时还有其他一些小问题,一个好的编译器会处理这些问题。打开警告,不要忽略它们!

于 2013-05-18T15:55:02.530 回答
0
  • 的第二个参数strcat是一个字符串。所以你必须发送一个以 null 结尾的数组char
  • %c格式printf 表示一个int,但是word是一个指向 的指针char
于 2013-05-18T15:56:40.427 回答
0

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

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

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

于 2013-05-18T15:56:47.643 回答
0

因为 1. 你的缓冲区太短(对于 26 个字母和终止的 0,你需要 27 个字节),2.strcat()想要字符串,你正在喂它 a 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);
}

别客气。

于 2013-05-18T15:55:22.463 回答