質問するログイン新規登録

回答編集履歴

1

補足を追加

2020/10/14 17:00

投稿

Daregada
Daregada

スコア11992

answer CHANGED
@@ -1,6 +1,7 @@
1
1
  - `fgets`は**改行`\n`も含めて読み込む**ため、キーワードとして入力する文字列末尾には、**Enterキーによる改行が付いている**。これを取り除かなければ、(比較対象の単語には改行は付いていないので)すべての比較が一致しない。
2
2
  - `fgets`の第2引数に、格納先の配列の**要素数+1を指定してはいけない**。配列の全要素に文字データが格納される状況で、自動的に付加される**ヌル文字`\0`が配列の範囲を超えて書き込まれる**。`sizeof`を利用して、配列の要素数を指定すべきだ。
3
3
  - ファイルから読み込んだ文字列から単語を切り出す際、**単語の長さが0であっても総単語数のカウンターを1増やしている**。改行を含む文字列で総単語数が1増えてしまうのはこれが原因だ。カウンターの処理の前に、単語の長さを調べれば対処できる。
4
+ - `fopen`に失敗したら、ファイル処理を続けてはいけない。
4
5
  - 配列名をそのまま使えばいい状況で、**意味もなくポインター変数を使うのはやめよう**。`p_word`, `p_key`, `buf`は、今回のコードではすべて不要だ。
5
6
  - if文で単語を構成する文字かどうかをチェックするさい、`isalnum`を使ったチェックを二重に行なっている。一度目のチェックが成立しないなら、**単語を構成しない文字であることは自明**なので、チェックは一度でいい。つまり、`if (alnum(...)) {...} else {...}`の形で書ける。
6
7
  - 文字列のクリアに配列の全要素を0クリアする必要はなく、先頭要素にヌル文字`\0`を設定するだけでいい。**ヌル文字`\0`より後ろは文字列処理に使われない**からだ。