2017-10-06 13 views
-3

enter image description hereセグメンテーション障害(コアダンプ)

これは、これはprint.c

#include <stdio.h> 
int wc(FILE *pointer) 
{ 
    int a; 
    int character=0,word=0,line=0; 
    a = getc(pointer); 
    while (a != EOF) 
    { 
    character++; 
    if (a == ' ') 
     word++; 
    if (a == '\n') 
     line++; 
    a = getc(pointer); 
    } 

    printf("character: %4d, word: %4d, line: %4d \n", character,word,line); 
    return 0; 
} 

これはword.c

ある

enter image description here

main.cのあります

gcc -c print.c 
gcc -c word.c 
gcc -c main.c 
gcc -o main main.o print.o word.o 
./main 
text.txt 
text.txt 
segmentation fault (core dumped) 

これは私が使用した方法をコンパイルしています。

しかし、私はなぜセグメンテーションフォルト(コアダンプされた)があるのか​​分かりません。

私を助けてください。

+1

すべての警告とデバッグ情報とともにコンパイルします。 'gcc -Wall -Wextra -g'です。デバッガ 'gdb'を使います。 fix-my-codeの質問は話題にはなりません。使用しているすべての標準機能について読む:[fopen(3)](http://man7.org/linux/man-pages/man3/fopen.3.html) - その他の多くの機能は失敗する可能性があります。それが[ここ](https://stackoverflow.com/a/18193383/841108)が好きではないことをテストしてください –

+1

画像の代わりにテキストを投稿する方が良いでしょう。 –

+2

一方で、ファイルを間に閉じずに2回開きます。 –

答えて

1

main()では、戻り値がNULLであるかどうかを確認してエラーが発生したかどうかを確認してください。

argc>1の条件が満足されていなくても、fopen()main()であっても、argv[1]を使用しています。 argc2未満の場合、argv[1]は存在しません。

printfile()のループwhileでは、breakステートメントは最初の反復自体で実行されます。

したがって、whileifとすると、breakを削除しても同じ効果が得られます。 wc()whileループで

if (a == ' ') 
    word++; 
if (a == '\n') 
    line++; 

if (a == ' ') 
    word++; 
else if (a == '\n') 
    line++; 

a(スペース)であればa\nであるかどうかをチェックする必要はありません作ることができます。

編集:あなたがそれらを使って完了したら、開いたすべてのファイルを閉じることを忘れないでください。

+0

私はまだ英語とCプログラミングに貧弱です。私はあなたのコメントを多くのことを理解しましたが、私はfclose()についてただ一つのことを理解していません...あなたが大丈夫なら、私のコードでfclose()を使うべき場所を教えてください...? – Huitseize

+0

@Huitseizeファイルの使用が終了するとすぐに。それでもファイルが必要だが別のファイルを開く必要がある場合は、_different_ファイルポインタを使用して開きます。 –

+0

@Huitseize 'main()'で2番目の 'fopen()'を削除した場合、 'fclose()'の使い方は適切です。 –

関連する問題