2016-05-02 15 views
-1

私はmyfという名前のファイルがあり、その中に多くのテキストがあり、単語の数を数える方法として空白を使用しようとしています。基本的には、私のプログラムのcountメソッドには、boolean関数のように動作する変数int dがあります。また、countと呼ばれるインクリメンタがあります。ファイル内の単語数を数えようとしています

私はforループを持っています。このループはメソッドcountの引数に入れられた配列をたどり、ポインタ*pが非文字であるかどうかを確認します。それが非文字であり、d=0の場合、d=1countがインクリメントされます。この方法では、次の文字も空白でない場合、d=1以降、else if文は再びインクリメントされません。 dが0にリセットされる唯一の方法は、スペースが存在する場合です。その時点で、別の文字が見つかった場合は、それが再びインクリメントされます。メソッドcountは変数countを返します。シンプルだが、間違った数字が出てくる。

#include <stdio.h> 
#include<stdlib.h> 
#include <string.h> 
#include <ctype.h> 

int count(char x[]) { 

    int d = 0; 
    int count = 0; 

    for (char *p = x; *p != EOF; *p++) { 
    // this will traverse file 
    printf("%c", *p); 

    // this is just to see the output of the file 
    if (*p == ' ' && d == 1) { 
     d = 0; 
    } 

    else if (*p != ' ' && d == 0) { 
     count++; 
     d = 1; 
    } 
    } 

    return count; 
} 

int main() { 

    char c; 
    int r = 0; 
    char l[1000]; 

    FILE *fp = fopen("myf", "r"); 
    while ((c = fgetc(fp)) != EOF) { 
    l[r] = c; 
    r++; 
    } 

    printf("\n %d", count(l)); 
} 
+0

私はCとあまり慣れていないんだけど、あなただけの大きな長い文字列にあなたのファイルを読み込み、スペースにそれを分割して、 'array.Length'プロパティを取得することができますか? – Radmation

+0

しかし、あなたの親友はコードフォーマッタです。合理的なインデントが単一の間隔であれば、本当に有益です。 –

+0

これは単線でも動作しますが、60語のテキストを含むと、それは数えきれないほどです:/ – Bossrevz

答えて

0

この

*p != EOF 

EOFをしないでください実際には負の整数であり、あなたはcharとしてそれを使用しています。あなたは私もp++*p++を変更

int m = 0; 
for (char *p = x; m < max; p++, m++) 

ノートのようなforループを使用し、その後、すなわち

int count(char x[], int max){ 

を反復処理する方法を多くのキャラクターに渡す必要があります。あなたはまた、非スペースなどつまり、この行には\nに遭遇したときに何が起こる

else if (*p != ' ' && d==0) 

ある事を考慮し、あなたのプログラムを更新する必要があり、それはおそらく、余分な単語をカウントします。

+0

これは私のファイル出力がこの写真のようにファイルの末尾にランダムな文字列を持つ理由ですか? https://gyazo.com/bdc1d73827ae61d80fc3a3e203a3c987 https://gyazo.com/d7a6b3bd1fd5ae843d5d427e72980f28 – Bossrevz

+0

あなたはそれを使用している方法でEOFを使用することはできません。私は私の答えをうなずきます。 – Harry

+0

ありがとうございました – Bossrevz

2

単語の数を数えるには、非文字の後の文字の出現を数えます。

*p != EOFは間違ったテストです。 EOFは、入力操作が1)入力を超えていないか、または2)入力エラーが発生したことを示します。 ではなく、は文字列の最後を示します。

使用intことがunsigned charEOFの範囲でintを返すようfgetc()からの結果を保存します。典型的には257の異なる値。 charが不十分です。

小さなもの:配列の必要はありません。コードは'を手紙と見なしましょう。言葉の数が非常に多くなる可能性があるので、コードにはunsigned long longのようなワイドタイプを使用してください。

#include <ctype.h> 
int isletter(int ch) { 
    return isalpha(c) || c == '\''; 
} 

#include <stdio.h> 
int main(void) { 

    unsigned long long count = 0; 
    FILE *fp = fopen("myf", "r"); 
    if (fp) { 
    int c; 
    int previous = ' '; 
    while ((c = fgetc(fp)) != EOF) { 
     if (!isletter(previous) && isletter(ch)) count++; 
     previous = ch; 
    } 
    fclose(fp); 
    }  
    printf("%llu\n", count); 
} 
+0

これは私のコードのかなり凝縮したバージョンです。ありがとう、私はこれを学びます。 – Bossrevz

関連する問題