2011-12-09 24 views
0

ちょっと私はテキストファイルの単語の数を数えて、Cからハンガマンゲームの単語を読み上げようとしていましたが、壁。私が使用しているこのコードは、私がこのコードを使用していると仮定しています。テキストファイルからCを使用して単語の数を数える

FILE *infile; 
     FILE *infile; 
char buffer[MAXWORD]; 
int iwant, nwords; 
iwant = rand() %nwords; 

// Open the file 

infile = fopen("words.txt", "r"); 

// If the file cannot be opened 

if (infile ==NULL) { 

    printf("The file can not be opened!\n"); 
    exit(1); 
} 

// The Word count 

while (fscanf(infile, "%s", buffer) == 1) { 

    ++nwords; 
} 

printf("There are %i words. \n", nwords); 

    fclose(infile); 
} 

これを修正する方法についてのご意見がありましたら、私は非常に感謝しています。

テキストファイルには、1行に1語、850語があります。

がバッファの提案を適用すると、しかし、ワードカウントはまだ1606419282.

勤務

int nwords = 0; 

を置くの補正を出てきました!どうもありがとうございました!

+1

答えはありませんが、http://www.leancrew.com/all-this/2011/12/more-shell-less-egg/ –

+0

@MartinBeckett Hah、今日もレッドディットでそれを見ましたか? – Rooke

+0

@Rooke news.ycombinator.com昨日! –

答えて

1

変数nwordsが初期化されることはありません。あなたはそれがゼロとして始まると仮定することはできません。

それがあった場合、あなたはその目的が私を見逃さ次の行にクラッシュ( "ゼロによる除算")を取得したい:

iwant = rand() %nwords; 

ので、

によって

int iwant, nwords; 
iwant = rand() %nwords; 

を置き換えますそれの後の最初の単語と空白文字を読んだ後

int nwords = 0; 
2

単語は1行に1つのエントリですか?

while (fscanf(infile, "%s", &nwords) == 1); { 
    ++nwords; 
} 

あなたの考えはしません。これは文字列ではないnwordsで文字列を読み取ります。 あなたはこのようにそれをしたいなら、あなたはあなたのデータファイルや使用中の最長の先取特権を含むのに十分な長さであるchar buffer[XXX]すなわち文字列を割り当てる必要があります。

while (fscanf(infile, "%s", buffer) == 1) { 
    ++nwords; 
} 
+0

@cnicutarが ';'あなたのループ内の '{'がループを一度だけ実行することを意味します。 –

0
  1. 、あなたの関数fscanfのRETU RNSはバッファに空白を入力します。それで、次回はEMPTYの単語を読む時です。
  2. 変更を提案:

    関数fscanf(INFILE、 "%sを"、&バッファ)のスペースに気づく// !!!バッファの前に&の前に

    それは次の単語まですべての空白を投げ捨てます。それは動作するはずです。


P.S.よく使わない[f] scanf :-)

関連する問題