你知道你尝试学习的那一刻,但是你错过了一些小细节,却无法弄清楚吗?我有其中一个,如果它结束了将非常感激。无论如何,这是我的代码:
//我试图为trie实现加载函数,特别是字典
//当我到达strcpy时遇到段错误,但当我检查' word'的值时那里,它是空的
bool load(const char *dictionary) {
FILE *file = fopen(dictionary, "r");
char *word = NULL;
char input[45] = { '\0' };
int size = sizeof(node);
while (fscanf(file, "%s", word) != EOF) {
printf("%s", word);
strcpy(input, word);
int cycle = 0;
node *next = &root;
while (input[cycle] != '\0') {
int position = toupper(input[cycle]) % 65;
if (position == 39) {
position = 26;
}
if (next->children[position] == NULL) {
next->children[position] = malloc(size);
next = next->children[position];
} else {
next = next->children[position];
}
}
*sizePointer = *sizePointer + 1;
next->wordHere = true;
}
fclose(file);
return true;
}
答案 0 :(得分:0)
使用fscanf时,需要确保为要写入的参数分配足够的内存。
例如,你可以按如下方式声明“word”:
char word[100];
这允许最多100个字符的字符串(包括终止空字符)。您提交的代码没有分配任何空间,并且您正在遇到未定义的行为。很可能fscanf会覆盖你的“输入”变量,但它实际上取决于编译器以及启用了哪些编译设置。
我建议你完全忘记变量“word”并将“输入”传递给你的fscanf。然后你也可以删除对strcpy的调用。
此外,fscanf是一种在使用时需要非常小心的功能。请在SO上查看此问题:When/why is it a bad idea to use the fscanf() function?
答案 1 :(得分:0)
您必须将word
定义为数组或指向实际数组的指针。将NULL
作为%s
转换说明符的目标传递具有未定义的行为。
此外,您应该传递要存储到阵列中的最大字节数,以防止潜在的缓冲区溢出。
最后,对返回值的测试应该是== 1
而不是!= EOF
。在这种特殊情况下,行为将大致相同,但一般情况下不会。
以下是修改后的版本:
bool load(const char *dictionary) {
FILE *file = fopen(dictionary, "r");
char word[45];
char input[45] = { '\0' };
int size = sizeof(node);
if (file == NULL)
return false;
while (fscanf(file, "%44s", word) == 1) {
printf("%s\n", word);
strcpy(input, word);
...