2017-09-11 1 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'は成功するとは保証されておらず、また' gets'もありますが、あなたは両方が成功し、決してその結果をチェックしないと信じているようです。 – WhozCraig

答えて

2

これは安全でないコードです。私は物事を順番に取り上げようとし、うまくいけばその過程のどこかであなたの質問に答えます。

1)ファイルが正常に開かれたことを確認する必要があります。これは、Java/C#/ Python /その他の高水準言語のように、例外をスローするようなものではありません。 if(fp == NULL) { /*handle error*/ }

2)変数asを同じにしようとしていますが、異なるタイプであり同等ではありません。 char s[80]は、スタックに80バイトの文字配列を割り当てます。 scharのようですが、実際にはタイプchar*なので、a = sというように、どうしているのか分かりません。

3)getsは、文字列以上の文字を返すことができます。 From the docs

成功すると、この関数はstrを返します。 文字の読み取り中にファイルの最後が である場合、eofインジケータは (feof)に設定されています。文字が読み取られる前にこれが発生した場合、返されるポインタは です。ポインタはNULLポインタです(strの内容は変更されずに のままです)。読み取りエラーが発生した場合、エラーインジケータ(ferror)は に設定され、NULLポインタも返されます(ただし、 strで示される内容が変更されている可能性があります)。

は直接fputsかもしれないあなたはラッキーだとすべてが正しいですが、誤りがある場合、それは爆破よ場合仕事に戻り値を渡ししようとしています。より高水準の言語では、あるメソッドの結果を別のメソッドのパラメータに直接渡すような誘惑がたくさんありますが、try/catchがないためにしばしばひどく終わるCでは、エラーはしばしば特殊ケースとして返されます戻り値よりコンパクトにし、長いコードを好んで、エラーのための適切なテストケースをすべて入れようとしないでください!

4)決してファイルを閉じません。 fclose(fp);に必ず電話してください。そうしないと、プログラムがクラッシュした場合にメモリリークが発生し、望ましくない動作が発生し、書き込んだデータが失われる可能性があります。

関連する問題