• 締切済み

単語数をカウントするアプリケーションを作りたい

お世話になっております(初心者です)。 現在指定した文字の文字数をカウントするアプリケーションを自作しているのですが、行き詰ってしまったのでご教授を頂けないでしょうか。 使用言語はC/C++で、コンパイラはgccです。 ----------以下ソース int data_read( HWND hwnd,char *f_name ) { int i; FILE *fpr; fpr=fopen(f_name,"r"); if( fpr == NULL ){ MessageBox(hwnd,"データ読み込みエラーです","データ読み込みエラー",MB_OKCANCEL); return(-1); } i=0; while( fgets(g_str02[i],W_MAX,fpr) != NULL){ i++; } fclose(fpr); return(i); } int cou_e(HWND hwnd){ int i; int j,k; int l; l = data_read( hwnd,"c:\\result.txt" ); for(j=0;j<=l;j++){ for(k=0;g_str02[j][k] = '\n';k++){ if( g_str02[j][k] == 'e' ){ i++; } } } g_cou_e = i; return(0); } ----------ソースここまで ※必要なヘッダファイルはインクルード済 ※g_str02[j][k]はグローバルで宣言した関数(char型)。 ※g_cou_eはグローバルで宣言した関数で、指定したテキストファイルの'e'の数が格納される関数(int型)。 ※c:\result.txtは文字数をカウントしたいテキストファイル。 このg_cou_eを他の関数で呼び出して使用したいのですが、今のところ実際にはテキストファイルに'e'は数個しか存在していないのにも関わらず、膨大な数値が表示されてしまったりしています。 ちなみに、コンパイラ自体は成功します。 どうぞ忌憚の無い意見をよろしくお願い致します。

みんなの回答

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.8

初心者とのことなので、色々落とし穴にハマるのも 勉強になって良いと思います。 私が作るのだったら... ファイル入出力は色々トラップが仕掛けられていて 怖いので"専門家"に任せます。(笑) 専門家といっても他人に丸投げするということでは ありません。ライブラリを使います。 gccでは私が勧めるのはPocoです。 "ファイル ストリーム", "例外" これでかなりすっきりしたプログラムになり 驚くと思います。 (Poco以外にも同じ機能をもつライブラリは多数あります) "車輪の再発明を行わない" こともプログラミングでは重要なことです。 (特に職業プログラマなど、スキル・アップを考えている場合) ぜひ挑戦してください!!! あと、"単語"の定義はどうしていますか? たとえば "私は プログラマです" という文の場合、 言語学的には "私" "は" "プログラマ" "です" の4つです。この定義に忠実に分析すると 構文木など高度な知識が必要です。 (”ワタシハプログラマデス”を分析する場合を考えてください。 名詞、助詞、動詞など日本語の文法チェッカーを実装する必要があります) もっと単純に "私は" "プログラマです" の2つとする場合もあります。 これは厳密には単語ではなく、(空白で区切られた)トークンと呼ばれます。 英語などの場合、トークン分割 ≒ 単語分割 ととらえられているようです。 トークン分割でしたらその名もズバリ strtok (ストリング・トークン  自己流の呼び方です) が非常に便利で、私も愛用しています。

回答No.7

>for(j=0;j<=l;j++){ だれか「g_str02には、g_str02[0]~g_str02[l - 1]まで文字列が入ってて、g_str02[l]には文字列が入ってない」って指摘してやれよ。 >for(k=0;g_str02[j][k] = '\n';k++){ も1つ、だれか「fgetsは、常に'\n'まで読むとは限らないので、読み込んだ文字列に'\n'が入っていない事もある。文字列の最後に確実に入っていると言えるのは'\0'だけだ」って指摘してやれよ。

回答No.6

>for(k=0;g_str02[j][k] = '\n';k++){ 誰か「g_str02[j][k] = '\n'」は「比較しないで代入してる」って指摘してやれよ。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.5

変数の初期化をしないで使っているからでは? cou_eの中で 変数iは初期かもされずに i++などのカウントアップを行っています したがって 変数iの内容は実行時にどのような値になっているのかわかりません jのforループの前で i=0; などの初期化を行いましょう また文字配列 g_str02の終端を '\n'で見ているようですが これも少々危険なように思います strlenなどや もともとの変数定義の長さ未満といった判定にした方がよさそうですが ・・・

回答No.4

こう言うのを参考にする事も出来ます。

参考URL:
http://www.google.co.jp/codesearch/p?hl=ja#K9KysWUhQhg/textutils-2.0g/src/wc.c&q=word%20count%20wc
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

>単語数をカウントするアプリケーションを作りたい >指定した文字の文字数をカウントするアプリケーションを自作している やりたいことは明確ですか? 単語数と文字数とは異なります。

noname#77845
noname#77845
回答No.2

勘違いだったらご免なさい。 補足してください。 for(k=0;g_str02[j][k] = '\n';k++){ のfor文はどういう動きをして欲しいの? 最初に変数iには何が入っていると思っている?

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

つ「cou_e内のiの初期化」