
以下の例はランダムな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で質問しましょう!
似たような質問が見つかりました
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- Visual Basic(VBA) Excel VBAでAA(BBB) → BBB.AA に置換したい 2 2022/10/30 13:59
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
jap実行時のTomcatのエラーに困...
-
マルチスレッドで同時にFTPアッ...
-
決まった拡張子のファイルだけ...
-
C# ListBoxのアイテムをユーザ...
-
「指定されたキャストは有効で...
-
C# で、あるフォルダー内にある...
-
C++のmap
-
string→CStringの型変換について
-
strcmp関数などでの複数の文字...
-
[VC#2005] プログラムからのメ...
-
【Java8以降】csvファイルの複...
-
C++初心者です stirng
-
HTML文書の文字コードの判定法
-
VBAで配列の計算
-
javaで処理のやり方がわかりま...
-
べき乗
-
ORA-01858: 数値を指定する箇所...
-
Timerについて教えて下さい
-
Log4jで機能毎に別ファイルへ出...
-
「例外 *** は対応する try 文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# ListBoxのアイテムをユーザ...
-
C#でIPアドレスの取得について
-
string→CStringの型変換について
-
「指定されたキャストは有効で...
-
【Java8以降】csvファイルの複...
-
jap実行時のTomcatのエラーに困...
-
特定の文字列が一致する行から...
-
C#での関数テーブルの作り方
-
PHPのSHA256変換について
-
Delphiで改行文字の置換がうま...
-
GDI+ DrawString() で指定範囲...
-
strcmp関数などでの複数の文字...
-
C# 他のアプリケーションから複...
-
c#で(",")区切りのcsvファイル...
-
SQLインジェクション
-
ArrayListを改良したい
-
HTML文書の文字コードの判定法
-
phpマニュアルの見方
-
2つのリストのマージ方法について
-
strncpy後のatoiがおかしい
おすすめ情報