アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下の例はランダムな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関数を使う場合などでも同じような感じです。)

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

A 回答 (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 文でループして比較する方が簡単ですね。
・以上。おわり。→質問者さんはこちらの『技』が知りたいのでしょう。多分?
    • good
    • 0
この回答へのお礼

これはすごいです!

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

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

お礼日時:2007/03/03 10:48

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

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"の場合の処理
}

補足日時:2007/03/03 09:53
    • good
    • 0

この例ならこれでいいと思うのですが。


int i = rand() % 3;
printf("%sです\n", string[i]);
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2007/03/03 09:25

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

このQ&Aを見た人はこんなQ&Aも見ています