[英]getc function produce segfault
程序:
#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);
}
}
输出:
$ ./a.out a b
Segmentation fault (core dumped)
$
在上面的程序中,当我们第二次调用f_gets时,将发生段错误。 即使我两次检查程序,也很难发现问题。 有谁能解释为什么会产生问题。
拨打电话时,您的第二个文件未打开。
问题是您正在通过短路从路径调用fopen
:
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
永远不会叫。
您可以通过将&&
替换为||
来解决此问题。 ,但是更好的方法是一次打开一个文件。
if((fp1=fopen(argv[1],"r"))== NULL && (fp2=fopen(argv[2],"r"))==NULL)
表示“如果程序无法同时打开fp1和fp2”。 您可以使用||
解决此问题 代替。 但是最好不要写长而复杂的表达式,因为它们只会增加增加编写错误的机会。
相反,请执行以下操作:
fp1=fopen(argv[1],"r");
if(fp1 == NULL)
{
// error handling
}
fp2=fopen(argv[2],"r");
if(fp2 == NULL)
{
fclose(fp1);
// error handling
}
另外,由于我们将程序重新编写为可读的内容,因此现在还发现了第二个错误。 如果程序打开了fp1但未能打开fp2,则在中止运行之前它永远不会关闭fp1。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.