2017-09-11 109 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);,否則如果程序崩潰,會導致內存泄漏,並可能導致一些不良行爲,導致您寫入的數據丟失。