• 締切済み

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

お世話になっております(初心者です)。 現在指定した文字の文字数をカウントするアプリケーションを自作しているのですが、行き詰ってしまったのでご教授を頂けないでしょうか。 使用言語は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 (ストリング・トークン  自己流の呼び方です) が非常に便利で、私も愛用しています。

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率43% (8536/19406)
回答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'だけだ」って指摘してやれよ。

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率43% (8536/19406)
回答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% (2126/6288)
回答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の初期化」

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語文字数4つカウント

    こんにちは。大学の課題で「キーボードから入力した文字数に含まれる'h''o''g''e'の4つの文字数をカウントする関数を含むプログラムを完成させよ」という課題がありました。なかなかできず現段階では以下のようになっています。どうすれば問題文のように実行できますか? #include <stdio.h> char str_chnum(const char str[], int ch) { int count = 0; int i; for(i = 0; str[i] != '\0'; i++) { if(str[i] == ch) count++; } return(count); } int main(void) { char str[128]; int ch; printf("文字列を入力してください:"); scanf("%s", str); printf("検索する文字を入力してください:"); scanf(" %c", &ch); printf("%cは%d個ありました。\n", ch, str_chnum(str, ch)); return(0); }

  • strings

    stringsと全く同じプログラムを作りたいんですが、どうもうまくいきません。 4文字以上読み込めるファイルが続いた時に表示すればいいんですが。。 ヒントを頂けるとありがたいです。 よろしくおねがいします。 #include<stdio.h> #define maxc 256 int main(int argc,char *argv[]) { FILE *fpr; char tmp[maxc]; char c; int i,evi=1; if(argc!=2){ //もしargcの数が2じゃなければ成り立たないからエラーを出す。 printf("それじゃできませんよ。\n"); return(-1); } fpr=fopen(argv[1],"r"); if(fpr==NULL){ printf("%s がありませんね。\n",argv[1]); return(-1); } i=0; /*****************読み込める時****************/ while((c=fgetc(fpr))!=EOF){ //fprから一文字ずつ読み込む。 if(c >= 0x20 && c<=0x7e){ //読み込める文字の場合 tmp[i]=c; i++; evi=0; //証拠を残す。 } /*****************読み込めない場合*********************/ else{ //読み込めない文字の場合 \0 or \n if(evi==0){ //一文字前が読み込める時 つまり\nの時 printf("\n"); } i=0; evi=1; } if(i>=4){ printf("%s",tmp); i=0; } } fclose(fpr); return(0); }

  • windowsのアプリケーションを作っているのですがどうにもうまくコン

    windowsのアプリケーションを作っているのですがどうにもうまくコンパイルできず困っています。 一ヶ月前に同じ質問をしたのですが具体的にどうすればいいのかわからなかったのでもう一度質問させていただきます。 キャスト演算子かポインタ関係だと思うのですがいろいろ変えてみてもうまくいきませんでした。 具体的にどうしたらできるようになるか答えていただけますでしょうか? 私の都合により、一ヶ月先に反応すると思うのでよろしくお願いします。 以下エラー部分です。 LRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam) { HDC hdc,hdcWin; PAINTSTRUCT ps; int i,j; switch(iMsg){ case WM_CREATE: lpDIB=(LPBYTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(BITMAPINFO)+E*F); lI=(LPBITMAPINFO)lpDIB; for(i=0;i<F;i++){ alpPixel[i]=(LPDWORD)(lpDIB+sizeof(BITMAPINFO)+E*i); } lI->bmiHeader.biSize =sizeof(BITMAPINFOHEADER); lI->bmiHeader.biWidth =B; lI->bmiHeader.biHeight =-B; lI->bmiHeader.biPlanes =1; lI->bmiHeader.biBitCount =B; lI->bmiHeader.biCompression =BI_RGB; for(i=0;i<D;i++){ *(alpPixel[0]+i)=0x00ff0000; *(alpPixel[1]+i)=0x0000ff00; *(alpPixel[2]+i)=0x000000ff; *(alpPixel[3]+i)=0x0000ffff; *(alpPixel[4]+i)=0x00ffffff; } hdc=GetDC(hwnd); hBMP=CreateCompatibleBitmap(hdcWin,C,C); hdcBMP=CreateCompatibleDC(hdc); hOldBMP=(HBITMAP)SelectObject(hdcBMP,hBMP); for(i=0;i<A;i++){ for(j=0;j<A;j++){ StretchDIBits(hdcBMP,j*B,i*B,B,B, 0,0,B,B,alpPixel[map[j+i*A]], lI,DIB_RGB_COLORS,SRCCOPY); } } ZeroMemory(&biInfo,sizeof(BITMAPINFO)); lI->bmiHeader.biSize =sizeof(BITMAPINFOHEADER); lI->bmiHeader.biWidth =C; lI->bmiHeader.biHeight =-C; lI->bmiHeader.biPlanes =1; lI->bmiHeader.biBitCount =B; lI->bmiHeader.biCompression =BI_RGB; ○ hBMP2=CreateDIBSection(hdc,&biInfo,DIB_RGB_COLORS,(LPVOID)(&lpPixel),NULL,0); //エラーはここ hdcBMP2=CreateCompatibleDC(hdc); hOldBMP2=(HBITMAP)SelectObject(hdcBMP2,hBMP2); ReleaseDC(hwnd,hdc); X=0; Y=1; return 0; case WM_DESTROY: ~中略~ } return DefWindowProc(hwnd,iMsg,wParam,lParam); } エラー E2034 169: 'void *' 型は 'void * *' 型に変換できない(関数 __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long) ) エラー E2340 169: 4 番目のパラメータは void * * 型として定義されているので void * 型は渡せない(関数 __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long) ) エラーの部分はこんな感じでした。

  • C言語で困っています...[文字数のカウント]

    C言語で困っているので教えていただきたいです。 ファイルのデータ(英文)を読み込み、一行毎の文字数(スペースも含む)とワード数を数えるプログラムを作成しています。 ワード数を数えることはできたのですが、文字数をどのように数えればよいかわかりません。 while文の後にif文でワード数を数えるようにしたので、同様に文字数も数えようとしましたが、 ( )内に何を入れるべきかで行き詰まりました。 バイト数を数えるようにすればよいのだろうとは思ったのですが...、 また、3行ある英文を読み込むのですが、 このままのプログラムだと3行全体でのワード数を求めるようになってしまっています。 1行ごとに文字数、ワード数を表示するにはどうしたらよいのでしょうか? ちなみにbcc developerを使っています。 どなたか、よろしくお願いします。 /* ファイルのデータ(英文)を読み込み、    一行毎の文字数(スペースも含む)とワード数を数える */ #include<stdio.h> int main(void){ char filename[20]; printf("ファイル名を入力してください:"); scanf("%s",filename);/*ファイルの名前を指定*/ FILE *f; int c; int j=0,k=0; f=fopen(filename,"r");/*ファイルを開く*/ if(f==NULL){ printf("%sがオープンできません!\n",filename); return 1; } while((c=fgetc(f))!=EOF){ if(c==' '||c=='\n') j++; } k=k+1; printf("⇒%d文字、%dワード\n",k,j); fclose(f);/*ファイルを閉じる*/ return 0; }

  • 課題で、アルファベットを入力するとすべてのアルファベットを小文字に変換

    課題で、アルファベットを入力するとすべてのアルファベットを小文字に変換して出力するプログラムを作成しました。2度以上同じ処理を行う場合はその部分を関数としなければいけないのですが、うまくできなかったようです。一応実行結果のとおりに表示されますが、複数のエラーや警告が出ました。どこが間違っているのでしょうか? ・警告 W8065 test.c 9: プロトタイプ宣言のない関数 'henkan' の呼び出し(関数 main ) ・エラー E2379 test.c 10: ステートメントにセミコロン(;)がない(関数 main ) ・警告 W8070 test.c 10: 関数は値を返すべき(関数 main ) ・エラー E2356 test.c 12: 'henkan' の再宣言で型が一致していない ・エラー E2344 test.c 5: 一つ前の 'henkan' の定義位置 ・エラー E2040 test.c 16: 宣言が正しく終了していない ・エラー E2141 test.c 16: 宣言の構文エラー ・エラー E2141 test.c 16: 宣言の構文エラー ・エラー E2190 test.c 29: 不要な } 実行結果↓ **************************** Atsushi TAKEDA ==>atsushi takeda **************************** #include <stdio.h> #include <string.h> #include <ctype.h> int henkan(); int main(void) { henkan() } int henkan; char str[100]; int i,j,chk,len; for(j=0;j<6;j++){ gets(str); len=strlen(str); printf("==>"); for(i=0;i<len;i++){ chk=isupper(str[i]); if(chk!=0) str[i]=tolower(str[i]); printf("%c",str[i]); } printf("\n"); } return 0; }

  • C言語 初心者です。

    今、英単語帳を作っているのですが、以下のソースではできません。 作ろうとしているプログラムは、a bを登録した場合、次がaabと来たら、 a aab bといったようにしたいのですが、できません。教えてください。 #include <stdio.h> #include <string.h> #define NUMBER 50 /*--- 単語帳の構造体*/ typedef struct { char *word; } words; /*--- 文字列strから文字列wordを検索する ---*/ char *str_chr(const char *str, int w) { for ( ; *str; *str++){ if (*str == w){ return ((char *)str); } } return (NULL); /*検索したが該当しないときはNULLを返す*/ } /*--- 単純交換ソート ---*/ void swap(int *x, int *y) { int temp = *x; *x = *y; *y = temp; } /*--- 配列dataの先頭n個の要素を昇順にソート ---*/ void sort(words data[], int n) { int k = n - 1; while (k >= 0){ int i, j; for (i = 1, j = -1; i <= k; i++) if (data[i - 1].word > data[i].word){ j = i - 1; swap(&data[i], &data[j]); } k = j; } } int main(void) { words word[NUMBER][20] = {{0},{0}}; char str[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; char w[128], *p; int count = 0; do{ printf("単語を入力してください。:"); /*単語を入力する*/ scanf("%s", w); p = str_chr(str, w); }while(p == NULL); count++; if(count >= NUMBER){ /*登録件数を調べる*/ printf("件数いっぱいです。\n"); } return (0); sort(word, NUMBER); return (0); }

  • 素数を求めるプログラム

    素数を求める関数の作り方を調べていたら以下のような プログラムを見つけました。 for文の中は奇数で割り切れるかどうかを調べているということで いいのでしょうか??何故j*j<=kとなっているのでしょうか?? 後、最後のreturn YES;はどのような場合実行されるのでしょうか?? #include<stdio.h> #define YES 1 #define NO 0 int sosu(int k){ int j; if(k == 2) return YES; if(k % 2 == 0) return NO; for(j=3;j*j<=k;j+=2){ if(k % j == 0) return NO; } return YES; }

  • c言語で任意のファイルから読み込んだ単語の数をカウントする

    c言語で任意のファイルから読み込んだ単語の数をカウントする 任意のファイルを読み込んだプログラムに、読み込んだ単語の数をカウントするプログラムを追加する課題が出ました。 条件は単語は空白で区切って1単語とする。改行も考慮に入れる。 関数を定義してポインタを使うらしいのですが検討がつきません。 下のプログラムでファイルを読み込むところまでは出来ています。 どうかご教授おねがいします;; #include <stdio.h> int main(int argc, char *argv[]) { FILE *myFile; int i=0,c; if(argc < 2) { fprintf(stderr,"alice.txt is required\n"); return 1; } myFile=fopen(argv[1],"r"); if(myFile==NULL) { fprintf(stderr,"Cannot open; %s\n",argv[1]); } while ((c=fgetc(myFile)) !=EOF) { fprintf(stderr,"%c",c); } fclose(myFile); return 0; }

  • 文字列の扱い方

    初歩的な質問ですみません… str文字列からcという文字を見つけたら添字を返すという関数を作ったのですが、 iにこの関数を代入して、if文の制御式にiを使って比較するまでは正常なのですが、 真文にiを使うと何故か偽文(という言い方でいいのでしょうか…この場合("そんな値はありません。"というところです)が実行されてしまいます。 よろしければご教授お願い致します。 #include <stdio.h> int str_char(const char str[],int c) { int len = strlen(str); int i; for (i = 0;i < len;i++) { if (str[i] == c) return i; } return -1; } int main() { char str[64] = "Fucking Brutal Death Metal"; int ch,i; printf("どの文字を調べますか?"); scanf("%c",&ch); i = str_char(str,ch); if (i >= 0) printf("その文字は%d番目にあります。",str_char(str,ch) + 1); //何故かiだと動かない else printf("そんな値はありません。"); return 0; }

  • 文字化けを直したい

    visual stadio C++ で、テキストファイルを読み込み、それをウインドウに表示するというプログラムを作っているのですが、表示すると文字化けしてしまいます。 原因がわかりません。 教えてください。 VC++ 2010です。 サイトを見て設定でマルチバイトに変えてあります case IDB_SELECT:{ HDC hDC; errno_t error; static LPCTSTR TEST_STR ;//= _T("左ボタンが押されました"); // ファイルを開くコモンダイアログを作成 if( !GetOpenFileName( &ofn ) ){ MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK ); SendMessage( hWnd, WM_CLOSE, 0, 0 ); return 0; } // 選択されたファイル名を表示 MessageBox( hWnd, filename_full, _T("OK"), MB_OK ); int k=0; fp = fopen( "test.txt", "r" ); if( fp == NULL ) /* 関数が失敗していないか */ { MessageBox( hWnd,"読み込み失敗", _T("bad"), MB_OK ); return 1; /* 異常終了は0以外を返す */ } MessageBox( hWnd,"読み込み成功", _T("good"), MB_OK ); hDC = GetDC( hWnd ); while (fgets(file, 80, fp) != NULL){ TEST_STR = &file[k]; TextOut( hDC, 50, k*15+50, TEST_STR, (int)_tcslen(TEST_STR) ); k++; } fclose(fp); } return 0L; } InvalidateRect(hWnd, NULL, TRUE); // 再描画命令発 return 0L;