首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getc函数生成segfault

getc函数生成segfault
EN

Stack Overflow用户
提问于 2016-04-08 17:37:41
回答 2查看 124关注 0票数 0

程序:

代码语言:javascript
复制
#include<stdio.h>
#include<string.h>

char *f_gets(char *s, int n, FILE *iop)
{
    int c=0;
    char *cs;
    cs = s;

    while (--n > 0 && (c = getc(iop)) != EOF)
    {
        if ((*cs++ = c) == '\n')
            break;
    }
    *cs = '\0';
    return (c == EOF && cs == s) ? NULL : s;
}


main(int argc, char *argv[])
{
    FILE *fp1,*fp2;
    char s2[100],s1[100];
    if (argc <= 2 )
        printf("2 argument needed \n"); 
    else
        if((fp1=fopen(argv[1],"r"))== NULL && (fp2=fopen(argv[2],"r"))==NULL)
            printf("cat: can't open The file\n");
        else
        {
            while(1)
            {
                f_gets(s1,100,fp1); // 1st iteration
                f_gets(s2,100,fp2); // 2nd iteration
                if(!strcmp(s1,s2)) 
                    printf("%s %s",s1,s2);
            }
            fclose(fp1);
            fclose(fp2);
        }
}

输出:

代码语言:javascript
复制
$ ./a.out a b
Segmentation fault (core dumped)
$ 

在上面的程序中,当我们第二次调用f_gets时,就会发生段故障。即使我两次检查程序,也很难找到问题所在。有没有人解释为什么它会产生这个问题。

EN

回答 2

Stack Overflow用户

发布于 2016-04-08 17:41:23

当您进行调用时,您的第二个文件未打开。

问题是,您正在使用短路从路径调用fopen

代码语言:javascript
复制
if((fp1=fopen(argv[1],"r"))== NULL && (fp2=fopen(argv[2],"r"))==NULL)

由于代码中的错误,当fp1正常打开时,fp2将始终保持关闭状态。这是因为(fp1=fopen(argv[1],"r"))== NULL的计算结果为0,并确保(fp2=fopen(argv[2],"r"))==NULL永远不会被调用。

您可以通过将&&替换为||来解决此问题,但更好的方法是一次打开一个文件。

票数 8
EN

Stack Overflow用户

发布于 2016-04-08 17:58:39

代码语言:javascript
复制
if((fp1=fopen(argv[1],"r"))== NULL && (fp2=fopen(argv[2],"r"))==NULL)

表示“如果程序无法同时打开fp1和fp2”。你可以通过使用||来解决这个问题。但最好不要编写又长又复杂的表达式,因为它们只会增加编写bug的可能性。

相反,请执行以下操作:

代码语言:javascript
复制
fp1=fopen(argv[1],"r");
if(fp1 == NULL)
{
  // error handling
}

fp2=fopen(argv[2],"r");
if(fp2 == NULL)
{
  fclose(fp1);
  // error handling
}

作为奖励:仅仅因为我们将程序重写为可读的内容,我们现在还发现了第二个bug。如果程序打开fp1但无法打开fp2,它在中止之前从未关闭过fp1。

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

https://stackoverflow.com/questions/36496299

复制
相关文章

相似问题

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