在 fscanf 之前初始化空指针

Posted

技术标签:

【中文标题】在 fscanf 之前初始化空指针【英文标题】:Initializing a null pointer before fscanf 【发布时间】:2021-12-29 13:26:00 【问题描述】:

所以我必须制作这个程序,将一个巨大的 .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,而不是“之后”。然后程序返回一个随机数。

【问题讨论】:

在使用fscanf的结果之前,您应该验证函数是否成功。有关更多信息,请参阅此问题:Why is “while ( !feof (file) )” always wrong? 请edit 正确格式化您的代码并显示您的_lexico_shuf.txt 文件的前8-9 行。 Lucas Nascimento,谁或什么文字建议像 while (!feof(filePointer)) 这样的代码? 因错误的主要原因关闭。 OP的主要问题是lexiconWord在调用fscanf(filePointer, "%[^;];%f\n", lexiconWord, ...时未初始化。 【参考方案1】:

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

把这个变量改成数组,用fscanf中的一个字段宽度不溢出缓冲区,检查fscanf的返回值。

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?

【讨论】:

@chux-ReinstateMonica 不,从来没有碰过它。标准和手册页中使用了术语“字段宽度”。 为什么是这样!..“一个大于零的可选十进制整数,指定最大字段宽度(以字符为单位)。”

以上是关于在 fscanf 之前初始化空指针的主要内容,如果未能解决你的问题,请参考以下文章

C++11 指针空类型 - nullptr

Objective-C 空指针和野指针

(转)空指针和野指针

Objective-C09-空指针和野指针

C++11 nullptr:初始化空指针

在未初始化的对象(空指针)上调用方法