2010-11-23 7 views
0

私はC言語で書かれたプログラムを持っています。このプログラムは引数として与えられたテキストファイルに "the"という単語が現れる回数を数える必要があります。しかし、プログラムはセグメンテーションフォールトエラーを返し続けます。これはどんな助けにも感謝します。ありがとう!ファイル内の単語を数えますか?

 

#include <stdio.h> 
#include <string.h> 
void main(int argc, char *argv[]) 
{ 
    int h,i; 
    FILE *fp; 
    char* mess; 
    for(i=1; i < argc; i++) 
    { 
    h=0; 
    fp=fopen(argv[i],"r"); 
     while (!feof(fp)) 
     { 
     fscanf(fp,"%s",mess); 
     if (strcmp(mess,"the")==0) 
      h++; 
     } 
     printf("The file %s contains the word \"the\" %d times.",argv[i],h); 
     h=0; 
     fclose(fp); 
    } 
} 
 
+0

このような仕事のためにCが過剰であると付け加えることができますか? "main = interact $ show。length。filter(==" the ")。words"で十分です。 –

+0

@IGCA、これはおそらく割り当てです。 –

答えて

5
char* mess; 
[...] 
     fscanf(fp,"%s",mess); 

混乱未初期化である:ここでは

は、コードがあります。あなたが読んでいる単語にいくらかのスペースを割り当てる必要があります

s 非ホワイトスペース文字のシーケンスに一致します。次の ポインタはcharへのポインタでなければならず、 の配列は、 がすべてのシーケンスを受け入れ、 のNUL文字を終了するのに十分な大きさでなければなりません。入力 の文字列は、空白文字または の最大フィールド幅で停止します。いずれかが発生した場合は、最初に になります。

したがって、フィールドの幅を使用して、読み取る内容をバッファーのサイズに制限することもできます。これは、あなたのバッファサイズの後のビットが "the"かもしれないので注意深い取り扱いが必要です。(例えば、4文字の単語を読むと、 "brea"と "the"と偽陽性を与えます)

0

fscanf(fp,"%s",mess);はメモリを割り当てません!

1

char* messは、ユニット化されたポインタです。言い換えれば、それは値がメモリ内のランダムなアドレスである変数です。 fscanfへの電話で、このアドレスに何かを書き込もうとすると、プログラムがクラッシュします。

messを固定サイズの配列にするか、またはmalloc(おそらくここでは役に立たない)を使用して動的に割り当てられた有効なメモリブロックを指し示すようにします。どちらの場合も、おそらくsize文字以上を読むことができないことを確認したいと思うかもしれません。まったく新しいセグメンテーション違反に終わるでしょう。

0

あなたはsscanfに与えられているバッファmessにメモリを割り当てる必要があります。

char mess[256];

現在、messが初期化されていない(NULL)です。 sscanfはそれに書き込もうとしています。

0
while (!feof(fp)) 
{ 
    fscanf(fp,"%s",mess); 
    if (strcmp(mess,"the")==0) 
    h++; 
} 

あなたは、charへの無地のポインタである、messにそれを入れて、ファイルから文字列を読んでいます。

fscanf(fp,"%s",mess); 
+1

いくつかのメモリが割り当てられていれば、 "charへのプレーンポインタ"は問題ありません。 –

0

:あなたは、文字配列を必要としますmess=malloc(sizeof(char)*SOME_NUMBER)のいずれかを使用するか、単純に文字の配列iとして混乱を宣言します。e char mess [1024];

0

は、メモリを割り当てる:私の知る限り、あなたが関数fscanfによって移入するためにそれを使用する前に、あなたがmessポインタを初期化していない、コードから読み取ることができるよう

char mess[1000]; 
関連する問題