gpt4 book ai didi

c - 文件处理在代码块中不起作用,但在 Turbo C++ 中很好

转载 作者:行者123 更新时间:2023-11-30 20:12:14 25 4
gpt4 key购买 nike

我正在尝试在循环中使用 fscanf 读取文件,但是当我执行它时,Windows 显示 file.exe 已停止工作。从字面上看,该程序在 TurboC++ 中运行良好(使用 clrscr() 而不是 system("cls"))。我知道这两个编译器之间存在重大差异,但我无法弄清楚。请帮助我提前致谢。

#include <stdio.h>
#include <conio.h>
#include <string.h>
int main()
{
FILE *fp;
char *c;
system("cls");
fp = fopen("test.txt", "w+");
fprintf(fp, "This is testing for fprintf...\n");
fputs("This is testing for fputs...\n", fp);
rewind(fp);
while(!feof(fp)){
fscanf(fp,"%s",c);
printf("%s\n",c);
}
fclose(fp);
return 0;
}

最佳答案

在调用 fscanf(fp,"%s",c); 之前,您尚未为 c 分配任何内存。因此,fscanf() 尝试将数据写入调用未定义行为的任​​意地址。您应该将 c 声明为数组

char c[SOME_LENGTH+1];

或使用malloc()

c = malloc( SOME_LENGTH+1 );

此外,正如 @alk hat 在他的评论中提到的,在 scanf() 中使用最大长度也更安全:

#define SOME_LENGTH 42
...
fscanf( fp, "%42s", c );

您还可以使用Stringifcation但您将需要两级宏

#define SOME_LENGTH     42
#define STR(L) #L
#define SCANFFMT(L) "%" STR(L) "s"
...
fscanf( fp, SCANFFMT(SOME_LENGTH), c );

关于c - 文件处理在代码块中不起作用,但在 Turbo C++ 中很好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36738814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com