首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getc中的故障分割

getc中的故障分割
EN

Stack Overflow用户
提问于 2014-09-06 11:00:26
回答 1查看 1.4K关注 0票数 0

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

代码如下:

代码语言:javascript
复制
#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);

}           

全球开发银行:

代码语言:javascript
复制
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中的错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-06 11:14:39

对于文件结束的检查,您实际上有一个无限循环,其中fgetc继续返回EOF,但您从不检查它。这将导致http://en.wikipedia.org/wiki/Undefined_behavior,因为您将编写远远超出buf数组范围的内容。可能发生的情况是,您随后覆盖FILE指针fp,将下一次对fgetc的调用大写为操作无效的FILE指针。

另外,正如在另一个注释中所指出的,fgets返回一个int。你需要知道(char) EOF != (int) EOF

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25699543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档