我正在尝试编写一个程序,用于打印字母表中所有单词的集合。这主要是让我习惯于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);
}
}
答案 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仅在达到零字节值时终止。
您的打印功能也会无限期地调用自己。这将导致堆栈快速溢出。