Fscanf只读取文件中的最后一个单词

时间:2016-09-07 22:48:09

标签: c file scanf

我正在尝试将文件中的单词插入到二叉树中。当我尝试在fscanf之后打印每个读取字符串时,插入函数也可以在不读取文件的情况下工作它也可以工作,但是当我尝试插入时它只能读到一个文件中的最后一个字符串。为什么会这样?

    while(1){

    if(fscanf(f,"%s %d",string,&x)==EOF)
          break;

      tree=insert(tree,string,x);
    }  

2 个答案:

答案 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,这可能会阻止编译器警告。顺便说一句,您应该启用所有可用的编译器警告,这样您就不必自己搜索错误。