プロが教えるわが家の防犯対策術!

引数として、複数の文字列を格納した配列、その文字列数、あるいは文字列aを与え、aが複数の文字列を格納した配列中に見つかれば1を返し、見つからなければ0を返す関数find_string()をつくりたいのですがよくわかりません。

どなたかご教授お願いします。
ヒントや考え方など教えて下さい。

A 回答 (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;
}
    • good
    • 0

「あるいは」に気を取られるけど、よくよく考えると、「複数の文字列を格納した配列」の方が問題だよなぁ…



自分で都合のいいように決めればいいのかな?

この回答への補足

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

補足日時:2010/12/15 16:59
    • good
    • 0

他の方が言うように、「あるいは」の意味が不明ですよね。


額面通りに捉えると、文字列数(数値)あるいは文字列(アドレス値)となりますが、
どちらの意味か判定する方法は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;
}
    • good
    • 0

#2 さんの改変版



・引数には文字列の配列とその要素数、検索対象の文字列aを与える
・文字列の配列内で、検索対象文字列aが「含まれている」ものを探す
・一つでも「含まれて」いれば1、全て比較しても「含まれて」いなければ0

>ヒントや考え方など教えて下さい。

 http://www.bohyoh.com/CandCPP/C/Library/strstr.h … 

 この strstr を使用すればいいと思います。

 cStr[ 3 ][ 32 } = {
   "どなたかご教示お願いします",
   "凸凹大学××教授が失踪した",
   "○○教授がノーベル賞を受賞した"
 };

関数内
{
 3回ループ( i++ )
 {
   if( NULL != strstr( cStr[ i ], "教授" ) ) return( 1 );
 }
 return( 0 ); // 全てに含まれていない
}
    • good
    • 0

たしかにこれはひじょーにわかりづらい。



それが素の文だとすると、私なら「あるいは」の部分を意図的に無視してこう取った上で、出題者にこれでいいかを確認しますね。

・引数には文字列の配列とその要素数、検索対象の文字列aを与える
・文字列の配列内で検索対象文字列aと「完全一致」するものを探す
・一つでも完全一致すれば1、全て比較しても一致しなければ0
    • good
    • 0

「よくわかりません」ということは, 「わかるところもあるけどわからないところもある」ってことだね. じゃあ


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

この回答への補足

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

補足日時:2010/12/15 01:08
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!