- ベストアンサー
複数の文字列の比較における効果的な手法
- 複数の文字列を比較する際にはstrcmp関数やstrstr関数を使用することが一般的ですが、if文の羅列が長くなってしまうという問題があります。
- 効果的な手法としては、文字列を照合するためのデータ構造を使用する方法があります。例えば、ハッシュテーブルやトライ木などのデータ構造を使用することで、効率的に文字列を比較できます。
- これらのデータ構造を使用することで、文字列の比較を簡潔かつ高速に行うことができます。また、プログラムのメンテナンス性を高めることもできます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
★追記。 ・指定の文字列を検索して見つかった関数(処理)を実行させます。 ・この場合のサンプルを下に載せます。→前回は『rand() % 3』で直接実行していますが…。 ・関数『FuncAAA()』~『FuncCCC()』と構造体は前と同じです。 サンプル: char *find = "bbb"; ←検索する文字列をセット int i; for ( i = 0 ; Table[i].string != NULL ; i++ ){ if ( !strcmp(find,Table[i].string) ){ Table[i].pfunc(); ←見つかった文字列をここで実行します break; } } 最後に: ・文字列が多い場合は、文字列の先頭文字(a-z)をハッシュ・キーとして検索させる方法を取れば 高速になります。または、バイナリ・サーチという方法も有効です。 ・文字列が少ない場合は、上記のサンプルのように for 文でループして比較する方が簡単ですね。 ・以上。おわり。→質問者さんはこちらの『技』が知りたいのでしょう。多分?
その他の回答 (3)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★文字列1つに対して1処理(関数)を関連付けるのはどうかな? ・関数のポインタを利用すれば簡単ですよ。 ・下にそのサンプルを載せます。 サンプル: void FuncAAA(void) { // aaa の処理 } void FuncBBB(void) { // bbb の処理 } void FuncCCC(void) { // ccc の処理 } static struct { char *string; void (*pfunc)(void); } Table[] = { "aaa", FuncAAA, "bbb", FuncBBB, "ccc", FuncCCC, NULL, NULL, }; int r = rand() % 3; Table[r].pfunc(); ←この1行で関連付けた関数を実行します 最後に: ・関数に引数を渡したい場合は 『void (*pfunc)(int param,char string);』と宣言して 『Table[r].pfunc(param,string);』として実行します。 ・また、関数に戻り値を追加したい場合は 『int (*pfunc)(void);』と宣言して 『int ret = Table[r].pfunc();』で戻り値を取得できます。 ・戻り値と引数を両方指定することも可能です。 ・以上。おわり。→『Table』の最後の『NULL』行は文字列検索で関数の実行させるために『終端』です。
- ham_kamo
- ベストアンサー率55% (659/1197)
switch文を使ってみました。if文の羅列とあまり変わりませんが、string[]の値によってやることが全然違うのであれば、何かしら羅列は必要になるのはしかたがないような気がします。 char *string[] = { "aaa", "bbb", "ccc", } ; int i = rand() % 3; switch (i) { case 0: "aaa"のときの処理 break; case 1: "bbb"のときの処理 break; case 2: "ccc"のときの処理 break; default: エラー処理 break; }
補足
すみません。 私が挙げた例だとiの値で上のようにswitchに出来てしまうので 質問の仕方や例のプログラムがやはり悪かったかもしれません。 もし下記のプログラムの様なことをやりたい場合も やはりif文の羅列・・・という感じになってしまうのでしょうか・・。 char string[80]; scanf("%s", string ); if ( strcmp( string[ i ], "aaa" ) == 0 ) { ;//stringが"aaa"の場合の処理 } if ( strcmp( string[ i ], "bbb" ) == 0 ) { ;//stringが"aaa"の場合の処理 } if ( strcmp( string[ i ], "ccc" ) == 0 ) { ;//stringが"aaa"の場合の処理 }
- herbest
- ベストアンサー率42% (15/35)
この例ならこれでいいと思うのですが。 int i = rand() % 3; printf("%sです\n", string[i]);
お礼
もしこれが文字列によって全くやることが違うようなケースなら・・ と言う意味で質問させていただきました。 上の例はあくまで例なのでprintfの部分は文字列によって 違うことをやっているとお考えください。
お礼
これはすごいです! ちょっと今の私には難しいですが、 頑張ってこの手法を使ってみます。 素晴らしい回答ありがとうございました。