自从我用C编码以来已经很长时间了,我花了大约两个小时来搜索如何正确使用fscanf。据我所知,这段代码是正确的,但每次运行时我都会得到EXC_BAD_ACCESS:
int rasterWidth;
int rasterHeight;
FILE* f = fopen("scene.u2d","r");
if (f == NULL)
{
perror("Can't open file!");
}
char m [2];
fscanf(f, "%s", m);
fscanf(f, "%d %d",&rasterWidth,&rasterHeight); // Getting EXC_BAD_ACCESS here
printf("%s %d %d",m,rasterWidth,rasterHeight);
我已经验证XCode正在打开正确的文件(它正确加载前两个字符)。 scene.u2d看起来像这样:
U2
500 500
-1.0 -1.0 1.0 1.0
g triangle.raw
c 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1
s 0.5 1.0
t 0.3 -0.2
有什么明显的东西我做错了吗?谢谢!
答案 0 :(得分:2)
详细说明我的评论并澄清我认为的问题。
fscanf(file,"%s", &buff)
将[string \ 0]置于buff中,因此buff必须至少比将要读入的任何可能字符串长1个字符。
答案 1 :(得分:2)
首先,scanf
的手册页说:
s
匹配一系列非空白字符;下一个指针必须是一个足够长的字符数组的指针 保存输入序列和终止空字符('\0'
),它是自动添加的。输入字符串停止 在白色空间或最大场宽,以先发生者为准。
这意味着由于null终止符,您至少需要char m[3]
该输入文件。
我还建议使用%2s
作为格式说明符,这样就不会溢出缓冲区。
如果这不是问题,您是否尝试过只运行您发布的代码段?它适用于我 - 我怀疑在发布的代码之前存在一些内存管理不善。或者,您的代码实际上是这样的:
int *rasterWidth, *rasterHeight;
fscanf(f, "%d %d",rasterWidth,rasterHeight); // this is definitely a bad access
对scanf调用的错误访问通常是通过传入未初始化的指针引起的。
答案 2 :(得分:1)
#include<stdio.h>
int main()
{
int rasterWidth = 0;
int rasterHeight = 0;
FILE* f = fopen("scene.u2d","r");
if (f == NULL)
{
perror("Can't open file!");
}
char m [3]; // or give enough space in buffer to hold any string --
// char m [256];
fscanf(f, "%s", m);
fscanf(f, "%d %d",&rasterWidth,&rasterHeight);
printf("%s\t %d\t %d",m,rasterWidth,rasterHeight);
}
我认为这段代码会有所帮助,