0

它只是一个程序,我试图读取在文件中作为参数传递的单词的出现次数,该文件也作为下一个参数传递。

代码如下所示:

#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);

}           

广发银行:

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. 但是为什么我getc在 gdb 中看到错误。

4

1 回答 1

1

取消对文件结尾的检查后,您实际上有一个无限循环,该循环fgetc 继续返回EOF,但您从不检查它。这会导致未定义的行为buf,因为您将在数组范围之外进行编写。可能发生的情况是您随后覆盖了FILE指针fp,将下一次调用封装为fgetc对无效FILE指针进行操作。

同样如另一条评论所述,fgets返回一个int. 你需要知道(char) EOF != (int) EOF

于 2014-09-06T11:14:39.930 回答