• ベストアンサー

【C言語教えて下さい!】文字検索

引数として、複数の文字列を格納した配列、その文字列数、あるいは文字列aを与え、aが複数の文字列を格納した配列中に見つかれば1を返し、見つからなければ0を返す関数find_string()をつくりたいのですがよくわかりません。 どなたかご教授お願いします。 ヒントや考え方など教えて下さい。

質問者が選んだベストアンサー

  • ベストアンサー
noname#137556
noname#137556
回答No.6

> 最初の配列は自分の好きなものを格納します。 中身の問題ではなくて,(混乱させてしまうかもしれませんが,) 「複数の文字列を格納した配列」を実現する方法が幾つか考えられます。 # 既に2通りの考え方に基づいた回答が出てる 例えば,  char a[] = "Red\0Green\0Blue";       // char 型の配列  char b[][8] = { "Red", "Green", "Blue" };  // (char 型の配列)の配列  char *c[] = { "Red", "Green", "Blue" };   // (char 型へのポインタ)の配列 これらは,いずれも「複数の文字列を格納した配列」と言えそうですが, メモリ上の文字列の配置が違います。 これらを受け取る関数の引数の型や,処理方法も変わります。 2番目のと3番目のは既に出ているので,(ANo.3 と ANo.4) 1番目ので作ってみました。 int find_string(const char *s, int n, const char *a) {   int i;   const char *p = s;   for (i=0 ; i<n ; i++) {     if (strcmp(p, a) == 0)  // 文字列の値が等しいか?       return 1;     p += strlen(p) + 1;   // 次の文字列に移動   }   return 0; }

その他の回答 (5)

noname#137556
noname#137556
回答No.5

「あるいは」に気を取られるけど、よくよく考えると、「複数の文字列を格納した配列」の方が問題だよなぁ… 自分で都合のいいように決めればいいのかな?

grantead
質問者

補足

最初の配列は自分の好きなものを格納します。

  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.4

他の方が言うように、「あるいは」の意味が不明ですよね。 額面通りに捉えると、文字列数(数値)あるいは文字列(アドレス値)となりますが、 どちらの意味か判定する方法はC言語仕様上ありません。 「あるいは」を無理やり採用してコーディングするとこうですか? int find_string(char **strings, unsigned int a /* 文字列数、あるいは文字列 */ ) {  int i;  for(i=0; i<a; i++){   if(strstr(strings[i], (char *)a))    return 1;  }  return 0; } ちなみに、当然ですがこれでは正しく動作することはできません。 No.2さんのように「あるいは」は無視すると、以下のように それなりのものが作れそうです。 int find_string(char **strings, int num, char *a) {  int i;  for(i=0; i<num; i++){   if(strstr(strings[i], a))    return 1;  }  return 0; }

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.3

#2 さんの改変版 ・引数には文字列の配列とその要素数、検索対象の文字列aを与える ・文字列の配列内で、検索対象文字列aが「含まれている」ものを探す ・一つでも「含まれて」いれば1、全て比較しても「含まれて」いなければ0 >ヒントや考え方など教えて下さい。  http://www.bohyoh.com/CandCPP/C/Library/strstr.html   この strstr を使用すればいいと思います。  cStr[ 3 ][ 32 } = {    "どなたかご教示お願いします",    "凸凹大学××教授が失踪した",    "○○教授がノーベル賞を受賞した"  }; 関数内 {  3回ループ( i++ )  {    if( NULL != strstr( cStr[ i ], "教授" ) ) return( 1 );  }  return( 0 ); // 全てに含まれていない }

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

たしかにこれはひじょーにわかりづらい。 それが素の文だとすると、私なら「あるいは」の部分を意図的に無視してこう取った上で、出題者にこれでいいかを確認しますね。 ・引数には文字列の配列とその要素数、検索対象の文字列aを与える ・文字列の配列内で検索対象文字列aと「完全一致」するものを探す ・一つでも完全一致すれば1、全て比較しても一致しなければ0

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

「よくわかりません」ということは, 「わかるところもあるけどわからないところもある」ってことだね. じゃあ ・どこまではわかるのか ・どこからがわからないのか を, もっとはっきり書いてほしい. あと, この関数の仕様に曖昧なところがある: 1. 「引数として、複数の文字列を格納した配列、その文字列数、あるいは文字列aを与え」ってあるけど, これは多分意味が通じない. 「あるいは」はどんな意味で使ってるの? 2. 「a が配列中に見つかる」というのは, 「正確に一致したものがある」という意味なのか「部分文字列として見付かる」だけでいいのか, どっち? 念の為聞いておきたいんだけど, 「ある文字列が別の文字列と正確に一致する」とか「ある文字列が別の文字列の中にある」というのはわかる?

grantead
質問者

補足

もともとこういう文なので・・・・・・・多分、引数として文字列を格納した配列を入力し、そこから検索したい文字列を入力→その文字列が最初の文字列の中に含まれていれば1を、ないなら0を返すものです。

関連するQ&A

専門家に質問してみよう