使用 fscanf 的 EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】使用 fscanf 的 EXC_BAD_ACCESS【英文标题】:EXC_BAD_ACCESS with fscanf 【发布时间】:2013-11-17 05:39:23 【问题描述】:

我有一个文件 inp,它看起来像:

123.456 one
111.111 two
222.222 three
444.444 four

我正在尝试读取此文件,例如:

while(fscanf(inp, "%s %s", s1, s2) != EOF)

其中123.456 存储在s1(字符串)和"one" 存储在s2(字符串)中。

但我收到此错误:

Thread 1:EXC_BAD_ACCESS (code = 1, address = 0x48)

知道为什么或如何解决此错误吗?

这是我的全部代码:

int main(void)

FILE *inp;
char s1[15];
char s2[8];

inp = fopen("inputfile.txt", "r");

while(fscanf(inp, "%s %s", s1, s2) != EOF)

    printf("%s", s1);


return 0;

我的调试区显示“123.456”存入s1,“one”存入s2。

【问题讨论】:

向我们展示您如何声明 s1s2 编辑了我的原始帖子以显示 s1 和 s2 声明。 您在哪里打开文件 - 只需发布整个代码 编辑了我的原始帖子以展示我的整个主要功能。 在我的设置上工作 [在添加必要的 std 包含之后]。尝试使用调试重建并放置回溯 【参考方案1】:

除了缺少 stdio.h 包括 (a) 之外,该代码没有任何问题。因此,您的问题要么出在其他地方(例如,如果您正在编译 不同的 文件),要么您的编译器有问题(不太可能)。

您只需稍作改动即可确定它是否是第一个:

#include <stdio.h>

int main (void) 
    FILE *inp;
    char s1[15];
    char s2[8];

    puts ("Hello from Pax");
    inp = fopen ("inputfile.txt", "r");
    if (inp == NULL) 
        puts ("Couldn't open input file");
     else 
        while (fscanf (inp, "%s %s", s1, s2) != EOF) 
            printf ("[%s] [%s]\n", s1, s2);
        
    

    return 0;

并查看是否有新消息出现。我建议进行调试的更改只是 Hello from Pax 输出,但我还对代码进行了一些清理以发现一些可能的问题。

在我的系统上,该代码输出:

Hello from Pax
[123.456] [one]
[111.111] [two]
[222.222] [three]
[444.444] [four]

正如预期的那样。


(a) 一个需要注意的可能性是在int 和指针宽度不同的系统中缺少包含文件。如果您的编译器假定非原型函数接受 int 参数,则可能会导致从堆栈上的错误位置提取参数。

This answer 针对不匹配的printf 格式说明符显示了这个特殊的小缺陷,您可能会从fscanf 看到相同的行为,因为它使用相同的功能。

但这只是我的有根据的假设,它可能不适用于这里。

【讨论】:

以上是关于使用 fscanf 的 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

使用 fscanf 读取逗号分隔的双精度

如何使用 fscanf 读取 UTF-8 编码

关于 fscanf_s 的 bug

关于 fscanf_s 的 bug

关于 fscanf_s 的 bug

关于 fscanf_s 的 bug