EXC_BAD_ACCESS用fscanf加载int

时间:2012-01-31 05:23:08

标签: c xcode scanf

自从我用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

有什么明显的东西我做错了吗?谢谢!

3 个答案:

答案 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);     
}

我认为这段代码会有所帮助,