こんばんは。
入門書のプログラムなのですが、どうしてもプログラムの進行上理解できないことがあり
相談のため書かせていただきました。
このファイルの検索を行うソースコードの中でint search = FALSE; が
一体どのような働きをしているのかが、全く理解できません。
これは全体のソースの中で何の役に立っているのでしょうか?
if(search) { の条件の中にはFALSE、つまり0が入ると思うのですが、
0が入ったらif(0){ となり処理をしなくなるのではないのですか?
入門書に書いてある「フラグを立てる」という概念がイマイチ理解できずに苦しんでいます。
どうか分かりやすく教えていただけないでしょうか?
何卒お願いいたします。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FALSE 0
#define TRUE 1
main () {
FILE *fp;
char filename[256];
char key[128];
char c;
int keylen;
int i = 0;
int search = FALSE;
int count = 0;
printf("ファイル名を入力して下さい > ");
scanf("%s", filename);
printf("検索文字列 > ");
scanf("%s", key);
keylen = strlen(key);
if((fp = fopen(filename, "r")) == NULL) {
printf("ファイルオープンエラー\n");
exit(1);
}
while((c = fgetc(fp)) != EOF){
if(search) {
if(c != key) { search = FALSE; i = 0; }
else { i++; }
} else {
if(c == key) { search = TRUE; i++; }
}
if(keylen == i) { count++; i = 0; search = FALSE; }
}
fclose(fp);
printf("出現回数 %d\n", count);
return 0;
}
int search = FALSE がどういう働きをしているのか分かりません
Re:int search = FALSE がどういう働きをしているのか分かりません
回答は一応規約を守ってからのがいいかと思うので、とりあえず<pre></pre>(<>は半角)でコードをくくってください。
Re:int search = FALSE がどういう働きをしているのか分かりません
今、検索文字が現われている最中かどうかのフラグですね。
ちょっとgnuindentで整形して、コメント入れてみました
検索途中で、違うと判断した直後に検索文字が現れた場合見逃すというバグもあるようです。
----file.txt-------
ababc
ababc
--------------
検索文字 "abc"
の場合、見つけられない
ちょっとgnuindentで整形して、コメント入れてみました
while ((c = fgetc(fp)) != EOF) { if (search) { // 検索2文字目から実行 if (c != key) { // 検索文字と違った時 search = FALSE; // 1文字目からの検索に戻す i = 0; // ここも、1文字目に設定 } else { i++; // まだ、検索状態が続く場合、次の文字と合致するかチェックのため i 増やす } } else { // 最初の1文字目を見つける時の為 if (c == key) { search = TRUE; // 1文字目が見つかったフラグ i++; // 2文字目にセット(i を 1 増やす) } } if (keylen == i) { // 検索文字の最後までいっていたら、 count++; // 出現回数 +1 i = 0; // 検索文字初期状態に戻す search = FALSE; // まだ見つかっていない状態に戻す } }こんなものでしょうか。
検索途中で、違うと判断した直後に検索文字が現れた場合見逃すというバグもあるようです。
----file.txt-------
ababc
ababc
--------------
検索文字 "abc"
の場合、見つけられない