为什么此代码导致分段错误?

时间:2009-07-31 15:31:40

标签: c

#include<stdio.h>


void main()
{
FILE  *fp,*fp1;
char c;
fp=fopen("test.txt","r");
fp1=fopen("test1.txt","w");
c=getc(fp);
while(c!=EOF)
{
    if (c=="")
    {
        c=getc(fp);
        continue;
    }
    else 
        fprintf(fp1,"%s",c);
    c=getc(fp);
}
fclose(fp);
fclose(fp1);

}

5 个答案:

答案 0 :(得分:10)

因为字符不是字符串。

尝试fputc。

BTW:c应该是int,否则你将无法检测到EOF。 EOF&gt; 255。

答案 1 :(得分:6)

代码中存在许多可能导致问题的错误。

在分配fp的结果以检查文件打开失败后,应该fp1NULLfopen进行核对。

c的类型应为int,以便您可以正确区分EOF与正确阅读的有效字符。

c == ""尝试将字符值与文字零长度字符串的地址进行比较。

fprintf(fp1,"%s",c)将字符值c解释为常量字符串的地址,并尝试按照此地址打印字符串。这是导致分段错误的最可能的错误。


不太重要的风格问题。

main的返回值应为int。即使许多实现允许void main(void),它也能正常运行。

由于if子句的主体与循环运行到最后并且后跟continue的情况相匹配,因此删除此子句并应用if可能会更清楚声明与您认为c==""应该成为现在的else声明相反的声明。

答案 2 :(得分:5)

c==""也不会像您认为的那样发挥作用。

答案 3 :(得分:3)

您的问题是变量c的fprintf(“%s”)。 c不是字符串,它是单个字符。用

替换该行
fprintf(fp1,"%c",c);

它会起作用。有更好的方法可以将一个文件的内容实际复制到另一个文件中。

答案 4 :(得分:0)

代码由于非法内存访问而导致分段错误,fprintf查找空字符以终止,并且在此过程中访问无效的内存位置。
还必须检查文件指针是否为null,如果有任何代码,则代码应正常退出它们是null,否则它也会导致段错误。

相关问题