2017-09-11 110 views
-3

我已经编写了这段代码,以便从用户那里获取输入并将其保存为文本文件。C:分段错误

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

但是如果我想写的fputs部分类似下面,它给了我分割错误,我怎么能强制转换得到()函数的返回值和解决这个问题!

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

你对'a = s;'有什么打算?建议:启用编译器中的所有警告,并将其设置为将其视为错误。 – Groo

+5

你怎么知道文件成功打开? – John3136

+2

我质疑'a = s;'的神经质,而这与使用['gets']缺乏任何意义相比就显得苍白(http://en.cppreference.com/w/c/io/gets)无论如何,这种邪恶和邪恶的功能已经从多年前的标准库中移除了。你看起来是一个相当信任的灵魂,因为'fopen'不能保证成功,也不会'获得',但你似乎相信双方都会成功,永远不会检查他们的结果。 – WhozCraig

回答

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指示符为 set(feof)。如果在读取任何字符之前发生这种情况,则返回的指针为空指针(并且str的内容保持 不变)。如果发生读取错误,则错误指示符(ferror)为 set,同时返回空指针(但由 str指向的内容可能已更改)。

试图返回值传递直接进入fputs威力工作,如果你是幸运的,一切是正确的,但如果有一个错误,它会炸毁。在更高级的语言中,有很多诱惑将方法的结果直接传递给另一个方法的参数,但是在C中,由于没有try/catch,所以通常很难结束,所以错误通常会返回为特殊情况返回值。不要试图让它变得更紧凑,更喜欢更长的代码,并将所有正确的测试用例列入错误!

4)你永远不会关闭文件。一定要拨打fclose(fp);,否则如果程序崩溃,会导致内存泄漏,并可能导致一些不良行为,导致您写入的数据丢失。