我正在尝试将文件中的单词插入到二叉树中。当我尝试在fscanf之后打印每个读取字符串时,插入函数也可以在不读取文件的情况下工作它也可以工作,但是当我尝试插入时它只能读到一个文件中的最后一个字符串。为什么会这样?
while(1){
if(fscanf(f,"%s %d",string,&x)==EOF)
break;
tree=insert(tree,string,x);
}
答案 0 :(得分:1)
insert()
不会复制字符串,它只会存储您在树中提供的指针。因此,所有树条目都包含指向同一字符串的指针,每次调用fscanf
时都会覆盖该字符串。
同样的问题发生在x
参数上,每次都传递相同的指针。您还需要为每个值分配一个新的int
。
while (1) {
if (fscanf(f, "%s %d", string, x) == EOF) {
break;
}
char *new_str = malloc(strlen(string)+1);
strcpy(new_str, string);
int *new_int = malloc(sizeof(*x));
*new_int = *x;
tree = insert(tree, new_str, new_int);
}
答案 1 :(得分:0)
您的代码应如下所示:
while (fscanf(f, "%s %d", string, &val) == 2) {
char *copy = malloc(strlen(string) + 1);
if (copy == NULL)
break;
strcpy(copy, string);
insert(copy, val);
}
请注意fscanf
的错误处理,它会检查是否可以读取这两个字段。另请注意&
前面的val
,这可能会阻止编译器警告。顺便说一句,您应该启用所有可用的编译器警告,这样您就不必自己搜索错误。