使用fscanf进行EXC_BAD_ACCESS

时间:2013-11-17 05:39:23

标签: 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(字符串)中。{/ p>

但是我收到了这个错误:

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中,“1”存储在s2中。

1 个答案:

答案 0 :(得分:2)

除了缺少的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看到相同的行为,因为它使用相同的功能。

但这只是我自己的教育假设,它可能不适用于此。