
以下の例はランダムな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関数を使う場合などでも同じような感じです。)
複数の文字列を判定する場合などにもっと良い手法は無いでしょうか?
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 文でループして比較する方が簡単ですね。
・以上。おわり。→質問者さんはこちらの『技』が知りたいのでしょう。多分?
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』行は文字列検索で関数の実行させるために『終端』です。
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;
}
この回答への補足
すみません。
私が挙げた例だと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"の場合の処理
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
特定の文字列が一致する行から...
-
string→CStringの型変換について
-
オブジェクトの中のプロパティ...
-
ORA-01858: 数値を指定する箇所...
-
System.err. printlnとSystem.o...
-
IF関数でEmpty値を設定する方法。
-
C言語のポインターに関する警告
-
動的配列が存在(要素が有る)か...
-
C言語 重複しない4ケタの乱数...
-
JSPでの計算結果表示
-
1~100までの数字を表示したい
-
hiddenの値が期待した値で取得...
-
JSPやサーブレットでSystem.out...
-
wsprintf関数の使い方について
-
ループ処理の際、最後だけ","を...
-
ページング
-
変数を動的に利用するには?
-
javaで質問です。 文字列2023/2...
-
ArrayListからBean配列に値をセ...
-
Javaで文字と数字が混ざったも...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【Java8以降】csvファイルの複...
-
C# ListBoxのアイテムをユーザ...
-
マルチスレッドで同時にFTPアッ...
-
strcmp関数などでの複数の文字...
-
特定の文字列が一致する行から...
-
デバックができない C#
-
「(string)$i」のような変則な文
-
C#でIPアドレスの取得について
-
★C#のXML読み込みについて
-
p->next(ポインタ)的なことを...
-
jap実行時のTomcatのエラーに困...
-
string→CStringの型変換について
-
C#についてです
-
プログラミングC++に関して質...
-
ArrayListを改良したい
-
コンストラクタの変数を別のコ...
-
「指定されたキャストは有効で...
-
C# List型のIndesOf メゾットに...
-
strtokでの空文字への置き換え
-
C#での関数テーブルの作り方
おすすめ情報