- 締切済み
strstrを利用しない文字列検索について
キーボードから入力した文字列 str に対し, This is~の文字列中に str が出現するかどうかを判定して表示するプログラムを作成したいのですが、うまくコンパイルができません。 条件ですが、、、 ・forループを利用し、0文字目、1文字目と順に検索していく ・strstr関数およびstring.hを利用しない です。このプログラムをいじって教えてほしいです。 ややこしくて答えづらい質問かと思いますが、有識者の知恵を拝借したいです。よろしくお願いします。 #include <stdio.h> int main(void) { char str[256]; char s[] = "This is a pen. That is an apple."; int i,j,k,checker; printf("This is a pen. That is an apple.\n\n"); gets(str); for(j=0;j<256;j++) { for(i=j,k=0;str[k]!='\0';k++,i++) { if(str[k]==s[i]) { checker=1; } else { checker=0; } } } if(checker==0) { printf("NG!その文字列は含まれていません。\n"); } else { printf("OK!その文字列は含まれています。\n"); } }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
if (! str[j]) と if (str[j] == 0) と if (str[j] == '\0') は同じ意味です. 同様に if (s[i]) と if (s[i] != 0) と if (s[i] != '\0') も同じ意味.
- Tacosan
- ベストアンサー率23% (3656/15482)
別解で探すところだけ: for (i = 0; s[i]; ++i) { for (j = 0; str[j] && s[i+j] == str[j]; ++j) ; if (! str[j]) break; } if (s[i]) { 文字列 str が見付かった } else { 見付からなかった }
- asuncion
- ベストアンサー率33% (2127/6289)
いろいろなアルゴリズムがありますが、これはほんのちょっとした例です。 #include <stdio.h> int main(void) { char str[256]; char s[] = "This is a pen. That is an apple."; int i, j; printf("%s\n\n", s); printf("検索したい文字列:"); gets(str); i = j = 0; while (s[i] != '\0' && str[j] != '\0') { if (s[i] == str[j]) { i++; j++; } else { i -= j - 1; j = 0; } } if (str[j] == '\0') printf("OK!その文字列は含まれています。\n"); else printf("NG!その文字列は含まれていません。\n"); return 0; } (注)インデントのため、全角空白を使っています。
お礼
無暗にfor文ばかり使わず、while文も混入させるとわかりやすいですね! 非常にためになりました。ありがとうございました!
お礼
回答ありがとうございます! 当方初心者なので少し疑問に思ったところがあるのですが、 if (! str[j]) if (s[i]) は何を意味しているのでしょうか? よろしければ教えてほしいです!