C:获取分段错误

时间:2017-09-11 23:49:52

标签: c segmentation-fault

我已编写此代码以获取用户的输入并将其另存为文本文件。

int main(){
    FILE *fp;
    fp = fopen("rahiv.txt", "w");
    char s[80];
    char a;
    gets(s);
    a = s ;
    fputs(s, fp);
}

但是如果我想编写下面的fput部分,它会给我分段错误,我怎样才能转换gets()函数的返回值并修复它!

int main(){
    FILE *fp;
    fp = fopen("rahiv.txt", "w");
    char s[80];
    fputs(gets(s), fp);
}

1 个答案:

答案 0 :(得分:2)

这是一些不安全的代码。我会尝试按顺序解决问题,并希望在此过程中的某个地方回答您的问题。

1)您需要确保文件已成功打开。这不像Java / C#/ Python /其他高级语言那样会引发异常。您必须检查if(fp == NULL) { /*handle error*/ }

2)您试图将变量等同于as,它们是不同的类型,而不是等效的。 char s[80]在堆栈上分配一个80字节长的字符数组。看起来s类型为char,但实际上类型为char*,所以行a = s ......好吧,我不确定它是做什么的。

3)gets可以返回的不仅仅是字符串。 From the docs

  

成功时,该函数返回str。 如果文件结尾是   在尝试读取字符时遇到,eof指示符是   设(feof)。如果在任何字符被读取之前发生这种情况,那么   返回的指针是一个空指针(并且str的内容保留   不变)。如果发生读取错误,则错误指示符(ferror)为   设置并返回一个空指针(但指向的内容   str可能已经改变了。)

尝试将返回值直接传递到fputs 可能会工作,如果你很幸运,一切都是正确的,但如果有错误,它会爆炸。在更高级别的语言中,有很多诱惑将方法的结果直接传递给另一个方法的参数,但是在C中,由于没有try / catch,因此通常会很糟糕地结束,因此错误通常会作为特殊情况返回返回值。不要试图使它更紧凑,更喜欢更长的代码,并将所有正确的测试用例放入错误中!

4)你永远不会关闭文件。请务必调用fclose(fp);,否则如果程序崩溃,您将导致内存泄漏,并可能导致一些不良行为,从而导致您编写的数据丢失。