在 fscanf 之前初始化空指针

Initializing a null pointer before fscanf

所以我必须编写这个程序,将一个巨大的 .txt 文件读取到 AVL 中,为此,我需要读取文本文档中的所有格式化数据并将其放入 AVL 中。但是,每当我尝试在我的代码中初始化 AVL(一个 NULL 指针)时,一旦它到达我用来从 .txt 文件中收集字符串的 fscanf 函数,它就会破坏代码。我在这里做了这个演示,我想我已经非常接近问题的根源了。我将其缩小到与在 fscanf 函数之前用 NULL 值初始化指针有关。但是我该如何解决这个问题?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {

    FILE * filePointer = fopen("_lexico_shuf.txt", "r");

    if(!filePointer) {
        printf("can't open the file");
        exit(101);
    }

    char *lexiconWord;
    float polarity;

    int *a = NULL;
    printf("before while");
    while (!feof(filePointer)) {
        fscanf(filePointer, "%[^;];%f\n", lexiconWord, &polarity);
        printf("| (%s) (%.1f) |", lexiconWord, polarity);
    }
    printf("after while");

}

所以屏幕上唯一打印的是“之前”printf,而不是“之后”。和程序returns一个随机数。

lexiconWord 尚未设置为指向任何地方,因此 fscanf 正在使用无效的指针值尝试写入。

将此变量更改为数组,并使用 fscanf 中的字段宽度,你不会溢出缓冲区,并检查 fscanf 的 return 值。

char lexiconWord[100];
...
int rval = fscanf(filePointer, "%99[^;];%f\n", lexiconWord, &polarity);
if (rval != 2) {
    printf("not all values read\n");
    exit(1);
}

另请参阅 Why is “while ( !feof (file) )” always wrong?