c - 带有 fscanf 的 EXC_BAD_ACCESS

标签 c exc-bad-access

我有一个文件 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,“一”存入s2。

最佳答案

除了缺少 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 和指针宽度不同的系统中缺少包含文件。如果您的编译器假定非原型(prototype)函数接受 int 参数,这可能会导致参数从堆栈的错误位置提取。

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

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

关于c - 带有 fscanf 的 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20027628/

相关文章:

C 根据真值表进行位运算

c# - 无法在 Visual C# 项目中使用我的 .dll

c - 读取数组时访问冲突

swift - 如何修复代码中的 EXC_BAD_ACCESS(code=1, address=0x10)

调用 stopDeviceMotionUpdates() 后抛出 iOS CoreMotion.MotionThread EXC_BAD_ACCESS

快速 setter 导致 exc_bad_access

ios - 访问嵌套完成 block 时崩溃 -- EXC_BAD_ACCESS

ios - Objective-C中的EXC_BAD_ACCESS错误

c - 如果我执行这个程序,我会得到 "Failed to Free"。但是在FREE函数内部,它只是正确地释放了内存

c - 没有得到所有结果来移动我的阵列