这是我作业的一小部分,我遇到了困难。这个部分还有更多功能,但这就是我遇到的所有困难(之后还有更多)。当我运行它时,它告诉我它无法读取整数文件。任何人都可以告诉我应该从哪里开始查看我出错的地方吗?
int * readIntegers(const char * filename, int * numberOfIntegers)
{
FILE* fp = fopen(filename, "r");
int count = 0;
// int array;
if(fp== NULL)
{
return NULL;
}
while(fscanf(fp, "%d", &count)>0)
{
(*numberOfIntegers)++;
}
printf("%d\n",*numberOfIntegers);
编译器警告,我并不关心这些,因为它们与我发布的内容没有关系
warning: return from incompatible pointer type [enabled by default]
warning: function returns address of local variable [enabled by default]
warning: unused variable ‘array’ [-Wunused-variable]
当它运行时,这就是我得到的......
./pa03 inputs/input0 > outputs/output0 ./pa03 inputs/input0 > outputs/output0
Failed to read integer-file 'inputs/input0', aborting
cat outputs/output0
Failed to read integer-file 'inputs/input0', aborting
cat outputs/output0
此外,最后的打印语句是诊断的,稍后在函数中我将返回一个显示答案的数组。我试图看看numberOfInputs是否更新到正确的数字,到目前为止还没有发生。我将更新我的打印状态以查看它是否有效...将更新。
现在是整个日志。
gcc -g -Wall -Wshadow -c -o obj / answer03.o answer03.c answer03.c:In function'readIntegers':answer03.c:85:2:警告:从中返回 不兼容的指针类型[默认启用] answer03.c:85:2: warning:函数返回局部变量的地址[启用 默认值] answer03.c:68:6:警告:未使用的变量'array' [-Wunused-variable] gcc -g -Wall -Wshadow -c -o obj / pa03.o pa03.c gcc -g -Wall -Wshadow obj / answer03.o obj / pa03.o -o pa03
./ pa03 inputs / input0>输出/ OUTPUT0 检测到 * glibc * ./pa03:munmap_chunk():指针无效:0x00007fff9ffebad0 * ======= Backtrace:========= /lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x2acd35b25b96] ./pa03[0x400c67] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x2acd35ac876d] ./pa03[0x400699] =======记忆图:======== 00400000-00402000 r-xp 00000000 08:06 1443970
/ home / matt / ECE264 / solutions / PA03 / pa03 00601000-00602000 r - p 00001000 08:06 1443970
/ home / matt / ECE264 / solutions / PA03 / pa03 00602000-00603000 rw-p 00002000 08:06 1443970
/ home / matt / ECE264 / solutions / PA03 / pa03 0219f000-021c0000 rw-p 00000000 00:00 0 [堆] 2acd35882000-2acd358a4000 r-xp 00000000 08:06 8130309
/lib/x86_64-linux-gnu/ld-2.15.so 2acd358a4000-2acd358a9000 rw-p 00000000 00:00 0 2acd35aa4000-2acd35aa5000 r - p 00022000 08:06 8130309 /lib/x86_64-linux-gnu/ld-2.15.so 2acd35aa5000-2acd35aa7000 rw-p 00023000 08:06 8130309
/lib/x86_64-linux-gnu/ld-2.15.so 2acd35aa7000-2acd35c5c000 r-xp 00000000 08:06 8127294
/lib/x86_64-linux-gnu/libc-2.15.so 2acd35c5c000-2acd35e5b000 --- p 001b5000 08:06 8127294
/lib/x86_64-linux-gnu/libc-2.15.so 2acd35e5b000-2acd35e5f000 r - p 001b4000 08:06 8127294
/lib/x86_64-linux-gnu/libc-2.15.so 2acd35e5f000-2acd35e61000 rw-p 001b8000 08:06 8127294
/lib/x86_64-linux-gnu/libc-2.15.so 2acd35e61000-2acd35e68000 rw-p 00000000 00:00 0 2acd35e68000-2acd35e7d000 r-xp 00000000 08:06 8130119 /lib/x86_64-linux-gnu/libgcc_s.so.1 2acd35e7d000-2acd3607c000 --- p 00015000 08:06 8130119
/lib/x86_64-linux-gnu/libgcc_s.so.1 2acd3607c000-2acd3607d000 r - p 00014000 08:06 8130119
/lib/x86_64-linux-gnu/libgcc_s.so.1 2acd3607d000-2acd3607e000 rw-p 00015000 08:06 8130119
/lib/x86_64-linux-gnu/libgcc_s.so.1 7fff9ffcd000-7fff9ffee000 rw-p 00000000 00:00 0 [stack] 7fff9ffff000-7fffa0000000 r-xp 00000000 00:00 0
[vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0
[vsyscall] ./bin/test.sh:line 20:8797 Aborted(核心 倾销)./ $ EXEC $ INF> $ OUTF cat输出/输出05未排序数组:35254288 0 194 5 -1610695872已排序 阵列号:35254289 5 -1610695984 1 -1610695872 - 失败(不是 排序)。未找到整数'35254288' - 失败。整数 '35254289'未找到 - 失败。
检查预期输出:预期/预期0 - 失败。预期:
未排序数组:4 1 3 2 5排序数组:1 2 3 4 5 - 正确。整数'4'在排序的第3位 数组 - 传递。排序数组中第4个位置的整数“5” - 通过。
make: * [test0]错误1
测试用例: 4 1 3 2 5
答案 0 :(得分:2)
printf("%n", numberOfIntegers)
调用会在numberOfIntegers
指向的整数中写入零。那是因为在解释%n
格式之前写的字符为零(参见printf()
的规范)。
可能你想使用:
printf("%d\n", *numberOfIntegers);
这是一个SSCCE(Short, Self-Contained, Correct Example),它基于问题中显示的代码,证明该代码没有任何可怕的错误 - 因此问题中遇到的问题是代码中没有所示。
#include <stdio.h>
static
int *readIntegers(const char *filename, int *numberOfIntegers)
{
FILE *fp = fopen(filename, "r");
int count;
if (fp == NULL)
{
return NULL;
}
while (fscanf(fp, "%d", &count) > 0)
{
(*numberOfIntegers)++;
}
printf("%d\n", *numberOfIntegers);
fclose(fp);
return numberOfIntegers;
}
int main(int argc, char **argv)
{
const char *file = "data";
int num = 0;
int *p;
if (argc > 1)
file = argv[1];
p = readIntegers(file, &num);
if (p != &num)
{
fprintf(stderr, "Failed to read numbers from file %s\n", file);
return 1;
}
else
printf("Number of numbers in file %s is %d\n", file, num);
return 0;
}
给定一个名为data
的文件,其中包含:
0 1 2 3 4 5 6 7 8 9 10
或者每个空格替换为换行符的等效文件,程序的输出为:
11
Number of numbers in file data is 11
如果程序被调用ri
( Read Integers ),并被称为:
$ ./ri missing
Failed to read numbers from file missing
$
在任何情况下都不会崩溃。我添加了代码来关闭文件并返回输入指针。此代码使用GCC 4.8.1在Mac OS X 10.8.4上完全编译,命令行设置为极其严格:
$ gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
> -Wold-style-definition ri.c -o ri
$
因此,如上所述,问题不在于提交给我们审查的代码片段中。
你忽略的编译器警告确实让我很担心,因为它们指的是在成功执行代码后会出现的问题。返回指向局部变量的指针是一种使程序崩溃的方法;从函数返回错误类型的指针是一种崩溃程序的方法。 (我会告诉你,未使用的变量警告就像他们得到的一样温和 - 我并不担心那个,尽管通过评论声明,你已经阻止它出现了。)
因此,您需要为任何人提供更多程序来成功诊断您的问题。你展示的是OK代码。