它只是一个程序,我试图读取作为参数在文件中传递的单词的出现次数,该文件也作为下一个参数传递。
代码如下所示:
#include <stdio.h>
extern void exit(int);
void main(int argc, char *argv[]) {
char C, buf[10];
int count = 0, i = 0;
FILE *fp;
if ( argc != 3 ) {
printf("Please provide proper args\n");
exit(0);
}
fp = fopen(argv[2], "r");
if( fp == NULL ) {
printf("File couldn't be opened\n");
exit(1);
}
else {
do {
while ( (C = fgetc(fp)) && ( C != ' ') ) {
//if ( C == EOF ) break;
buf[i] = C;
i++;
}
buf[i] = '\0';
i = 0;
if (strcmp(argv[1], buf) == 0) count++;
} while (C != EOF );
}
close(fp);
printf("Total \"%s\" occurances is %d\n", argv[1], count);
}
GDB:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a925fd in getc () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.18-12.fc20.x86_64
现在,如果我在第一个"if"
之后移除while
语句之前的注释,则不会出现段错误。该程序中唯一的一行是评论。
但如果情况确实如此,那么我们肯定已越过getc
部分而进入了一段时间。我在想strcmp
时可能会遇到问题。但为什么我在gdb中的getc
中看到错误。
答案 0 :(得分:1)
检查文件末尾已经过时,你实际上有一个无限循环,其中fgetc
继续返回EOF
,但你永远不会检查它。这会导致undefined behavior,因为您将在buf
数组的边界之外写入。可能会发生的情况是,您覆盖FILE
指针fp
,将下一次调用fgetc
包含在无效的FILE
指针上。
另外,如其他评论中所述,fgets
会返回int
。您需要知道(char) EOF != (int) EOF
。