我正在尝试实现一个类似于 20 Questions 的程序,其中加载了一个包含问题和猜测答案的文本文件,复制到一个 char 数组中(其中新的空格行被替换为 '/0' 以便拆分问题成单独的字符串)。将文本文件复制到其中后,该数组可以正常工作。建立一个树结构将短语组织成是/否问题树,其中左孩子是是的响应,而右是否响应,而叶子是程序最后用来猜测的猜测。
我遇到的问题是,在我构建树(从 InitTree 调用 treeBuilder)之后,复制文本文件中的短语的数组内容被破坏了。
在调用 InitTree 之前,数组内容如下所示:
是不是毛茸茸的?它喵喵叫吗?猫 狗 它有象牙吗?它有大耳朵吗?大象 犀牛 鳄鱼
调用后是这样的:
是不是毛茸茸的?-???` ?p ?a dog 它有象牙吗?它有大耳朵吗?大象 犀牛 鳄鱼
我一直在测试它停止工作的位置,并且在 treeBuilder 中,数组的所有元素都完好无损,但是一旦对 treeBuilder 的函数调用结束,数组就会损坏。我尝试通过在分配内存时使用 calloc 来保护内存,甚至通过使字符数组静态化,这在发生这种情况的类似情况下工作。但我所有的预防措施似乎都不起作用,我不确定问题出在哪里。我已经尝试在 stackoverflow 上查看类似案例,但我无法找到与我的问题相关的任何内容。
由于显而易见的原因,当程序实际开始使用树时,这最终会导致段错误。
我试过运行 gdb,但无论出于何种原因,它都不会让我逐行遍历,因为它找不到行信息,并且只是跳过所有内容,直到它提示输入,或者出现内存错误或其他东西,所以在这里运行 gdb 不是很有帮助。我猜这可能是因为 main 函数在包含的文件中。但这无关紧要。
这是与问题相关的代码:
struct treeStruct {
char *string;
struct treeStruct *left, *right;
};
typedef struct treeStruct *TreeType;
// Builds a tree
void treeBuilder(TreeType tree, char **phrase, long level){
// Gets the level (number of tabs) of the next phrase
long nextLevel = countTabs(*phrase + strlen(*phrase) + 1);
tree->string = *phrase + level; // Assigns the response pointer to the tree array
// Move the pointer to the next string, since the the strings need to be
// put into the tree in linear order
(*phrase) += strlen(*phrase) + 1;
if (level >= nextLevel){
// Compares the current level with the level of the next string
// to determine if returning up the tree is necessary;
// This should be the answer to a question.
tree->left = NULL;
tree->right = NULL;
return;
}
else{
// Makes sure the left and right pointers of the struct have
// allocated space
tree->left = calloc(1, sizeof(TreeType));
tree->right = calloc(1, sizeof(TreeType));
// Adds the yes and no branches to the tree, recursion will take care
// of adding sub-branches
treeBuilder(tree->left, phrase, level + 1);
treeBuilder(tree->right, phrase, level + 1);
}
return;
}
TreeType InitTree (char *file){
if(file == NULL){
printf("File '%s' does not exist.\n", file);
exit(2);
}
FILE *fp;
fp = fopen(file, "r");
// Create a space in memory for the loaded questions to occupy
static char *phrases;
phrases = (char *)malloc(MAXSTR * MAXNUMQS * sizeof(char));
copyText(fp, phrases);
fclose(fp);
// Create space in memory for the tree structure
TreeType tree;
tree = (TreeType) calloc(1, sizeof(TreeType));
// Create a pointer to a pointer so that treeBuilder can
// change what the first pointer is pointing to, so the strings in
// phrases can be added in order throughout the recursion
static char *phrase_ptr, **phrase_ptr2;
phrase_ptr = &phrases[0];
phrase_ptr2 = &phrase_ptr;
//Build the tree
treeBuilder(tree, phrase_ptr2, 0);
topNode = tree;
return tree;
}
抱歉,如果这是 tl;dr,但我想尽可能清楚地说明我的问题。