在 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 之前初始化空指针的主要内容,如果未能解决你的问题,请参考以下文章