みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

strcmp関数などでの複数の文字列の比較

以下の例はランダムなiの値で文字列にアクセスして
その文字列がどの文字列であるかを判定しているプログラムです。

char *string[] = {
  "aaa",
  "bbb",
  "ccc",
} ;

int i = rand() % 3;

if ( strcmp( string[ i ], "aaa" ) == 0 )
{
  printf("aaaです");
}

if ( strcmp( string[ i ], "bbb" ) == 0 )
{
  printf("bbbです");
}

if ( strcmp( string[ i ], "ccc" ) == 0 )
{
  printf("cccです");
}


するとこのようにif文の羅列になってしまいます。
(strstr関数を使う場合などでも同じような感じです。)

複数の文字列を判定する場合などにもっと良い手法は無いでしょうか?

投稿日時 - 2007-03-03 08:03:36

QNo.2798565

暇なときに回答ください

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

★追記。
・指定の文字列を検索して見つかった関数(処理)を実行させます。
・この場合のサンプルを下に載せます。→前回は『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 文でループして比較する方が簡単ですね。
・以上。おわり。→質問者さんはこちらの『技』が知りたいのでしょう。多分?

投稿日時 - 2007-03-03 10:18:06

お礼

これはすごいです!

ちょっと今の私には難しいですが、
頑張ってこの手法を使ってみます。

素晴らしい回答ありがとうございました。

投稿日時 - 2007-03-03 10:48:51

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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』行は文字列検索で関数の実行させるために『終端』です。

投稿日時 - 2007-03-03 10:16:48

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

投稿日時 - 2007-03-03 09:46:44

補足

すみません。
私が挙げた例だと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"の場合の処理
}

投稿日時 - 2007-03-03 09:53:01

ANo.1

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

投稿日時 - 2007-03-03 08:48:31

お礼

もしこれが文字列によって全くやることが違うようなケースなら・・
と言う意味で質問させていただきました。

上の例はあくまで例なのでprintfの部分は文字列によって
違うことをやっているとお考えください。

投稿日時 - 2007-03-03 09:25:19

あなたにオススメの質問