• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:strcmp関数などでの複数の文字列の比較)

複数の文字列の比較における効果的な手法

このQ&Aのポイント
  • 複数の文字列を比較する際にはstrcmp関数やstrstr関数を使用することが一般的ですが、if文の羅列が長くなってしまうという問題があります。
  • 効果的な手法としては、文字列を照合するためのデータ構造を使用する方法があります。例えば、ハッシュテーブルやトライ木などのデータ構造を使用することで、効率的に文字列を比較できます。
  • これらのデータ構造を使用することで、文字列の比較を簡潔かつ高速に行うことができます。また、プログラムのメンテナンス性を高めることもできます。

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.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 文でループして比較する方が簡単ですね。 ・以上。おわり。→質問者さんはこちらの『技』が知りたいのでしょう。多分?

amazontester
質問者

お礼

これはすごいです! ちょっと今の私には難しいですが、 頑張ってこの手法を使ってみます。 素晴らしい回答ありがとうございました。

その他の回答 (3)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★文字列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)
回答No.2

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

amazontester
質問者

補足

すみません。 私が挙げた例だと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)
回答No.1

この例ならこれでいいと思うのですが。 int i = rand() % 3; printf("%sです\n", string[i]);

amazontester
質問者

お礼

もしこれが文字列によって全くやることが違うようなケースなら・・ と言う意味で質問させていただきました。 上の例はあくまで例なのでprintfの部分は文字列によって 違うことをやっているとお考えください。