- ベストアンサー
【C言語教えて下さい!】文字検索
引数として、複数の文字列を格納した配列、その文字列数、あるいは文字列aを与え、aが複数の文字列を格納した配列中に見つかれば1を返し、見つからなければ0を返す関数find_string()をつくりたいのですがよくわかりません。 どなたかご教授お願いします。 ヒントや考え方など教えて下さい。
- みんなの回答 (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)
「あるいは」に気を取られるけど、よくよく考えると、「複数の文字列を格納した配列」の方が問題だよなぁ… 自分で都合のいいように決めればいいのかな?
- jjk65536
- ベストアンサー率59% (66/111)
他の方が言うように、「あるいは」の意味が不明ですよね。 額面通りに捉えると、文字列数(数値)あるいは文字列(アドレス値)となりますが、 どちらの意味か判定する方法は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)
#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)
たしかにこれはひじょーにわかりづらい。 それが素の文だとすると、私なら「あるいは」の部分を意図的に無視してこう取った上で、出題者にこれでいいかを確認しますね。 ・引数には文字列の配列とその要素数、検索対象の文字列aを与える ・文字列の配列内で検索対象文字列aと「完全一致」するものを探す ・一つでも完全一致すれば1、全て比較しても一致しなければ0
- Tacosan
- ベストアンサー率23% (3656/15482)
「よくわかりません」ということは, 「わかるところもあるけどわからないところもある」ってことだね. じゃあ ・どこまではわかるのか ・どこからがわからないのか を, もっとはっきり書いてほしい. あと, この関数の仕様に曖昧なところがある: 1. 「引数として、複数の文字列を格納した配列、その文字列数、あるいは文字列aを与え」ってあるけど, これは多分意味が通じない. 「あるいは」はどんな意味で使ってるの? 2. 「a が配列中に見つかる」というのは, 「正確に一致したものがある」という意味なのか「部分文字列として見付かる」だけでいいのか, どっち? 念の為聞いておきたいんだけど, 「ある文字列が別の文字列と正確に一致する」とか「ある文字列が別の文字列の中にある」というのはわかる?
補足
もともとこういう文なので・・・・・・・多分、引数として文字列を格納した配列を入力し、そこから検索したい文字列を入力→その文字列が最初の文字列の中に含まれていれば1を、ないなら0を返すものです。
補足
最初の配列は自分の好きなものを格納します。