• 締切済み

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"); } }

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

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)
回答No.2

別解で探すところだけ: 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 { 見付からなかった }

maru1021
質問者

お礼

回答ありがとうございます! 当方初心者なので少し疑問に思ったところがあるのですが、 if (! str[j]) if (s[i]) は何を意味しているのでしょうか? よろしければ教えてほしいです!

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

いろいろなアルゴリズムがありますが、これはほんのちょっとした例です。 #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; } (注)インデントのため、全角空白を使っています。

maru1021
質問者

お礼

無暗にfor文ばかり使わず、while文も混入させるとわかりやすいですね! 非常にためになりました。ありがとうございました!

関連するQ&A