K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[2421] 第5章ポインタの真の使い方 単語の使用頻度を数える
投稿者:hdmr
2025/05/18 17:06:01

お世話になっております。 表題の件について、作成したword_count(配列版)をgccで実行しました。 すると出力結果が以下のようになりましたが、これで正しいのでしょうか? ご確認よろしくお願いします。 <読み込ませたtxtファイルの中身> ABCDE <出力結果> A 1 C 1 E 1 ※なぜか1個飛ばしで結果が表示される。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2422] Re:第5章ポインタの真の使い方 単語の使用頻度を数える
投稿者:(ぱ)こと管理人
2025/05/19 00:46:42

はじめまして。ご質問ありがとうございます。 ><読み込ませたtxtファイルの中身> >ABCDE > ><出力結果> >A 1 >C 1 >E 1 > >※なぜか1個飛ばしで結果が表示される。 このプログラムは「単語の」出現頻度を数えるプログラムであって、文字の出現頻度を 数えるものではないので、これは「1個飛ばし」ではありません。読み込ませたtxtファイルの 中身がABCDEなら、 ABCDE 1 が正しい出力結果です。 入力ファイルのエンコーディングがUTF16である可能性も考えましたが、その場合でも A 1 B 1 C 1 D 1 E 1 となりそうなものです(当方で試したらそうなりました)。 get_word.cがそちらで打ち込まれたものなら、それをそのままここに貼っていただけないでしょうか? 27: } while ((ch = getc(fp)) != EOF && isalnum(ch)); このあたりが怪しい気がします。isalnumの前に!がついているとか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2423] Re:第5章ポインタの真の使い方 単語の使用頻度を数える
投稿者:hdmr
2025/05/19 21:33:28

お疲れ様です。 先生のご指摘の通り、「!isalnum(ch)」となっていました。 この部分を修正し、動作させると実行結果は「ABCDE 1」となりました。 ありがとうございます。 <修正前のget_word.c> int get_word(char* buf, int buf_size, FILE* fp) { int len; int ch = 0; /* 空白文字の読み飛ばし */ while (((ch = getc(fp)) != EOF) && !isalnum(ch)) { ; } if (ch == EOF) { return EOF; } /* ここで、chには、単語の最初の文字が格納されている */ len = 0; do { buf[len] = ch; len++; if (len >= buf_size) { /* 単語が長すぎるためエラー */ fprintf(stderr, "word too long\n"); exit(1); } } while (((ch = getc(fp)) != EOF) && !isalnum(ch)); //ミス!!!! buf[len] = '\0'; return len; }
[この投稿を含むスレッドを表示] [この投稿を削除]