我有一个文件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中。
答案 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
看到相同的行为,因为它使用相同的功能。
但这只是我自己的教育假设,它可能不适用于此。