以下の例はランダムな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も見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。 「そうなんだね」と「確かに披露する場所ないね」で評価します。
-
とっておきの手土産を教えて
お呼ばれの時や、ちょっとした頂き物のお礼にと何かと必要なのに 自分のセレクトだとついマンネリ化してしまう手土産。 ¥5,000以内で手土産を用意するとしたらあなたは何を用意しますか??
-
おすすめのモーニング・朝食メニューを教えて!
コメダ珈琲店のモーニング ロイヤルホストのモーニング 牛丼チェーン店の朝食などなど、おいしいモーニング・朝食メニューがたくさんありますよね。
-
タイムマシーンがあったら、過去と未来どちらに行く?
20XX年、ついにタイムマシーンが開発されました。 あなたは過去に行く? それとも未来? タイムマシーンにのって、どこに行って、何をしたいか教えてください!
-
strcmp( )関数について教えて下さい
C言語・C++・C#
-
C言語初心者の質問失礼します。
C言語・C++・C#
-
python エラー
その他(プログラミング・Web制作)
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
GridViewで複数のDropDownList...
-
c言語
-
【Java8以降】csvファイルの複...
-
C# 他のアプリケーションから複...
-
Delphiで改行文字の置換がうま...
-
C#でIPアドレスの取得について
-
「指定されたキャストは有効で...
-
strcmp関数などでの複数の文字...
-
C# ListBoxのアイテムをユーザ...
-
string→CStringの型変換について
-
ループ処理の際、最後だけ","を...
-
JSPやサーブレットでSystem.out...
-
system.out.printが出力されない
-
C言語のポインターに関する警告
-
javascriptで文字列のsjis利用...
-
オブジェクトの中のプロパティ...
-
System.err. printlnとSystem.o...
-
大量のデータを読み込んで表示...
-
Log4jで機能毎に別ファイルへ出...
-
ダブルクォーテーションのrepla...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
strcmp関数などでの複数の文字...
-
C# ListBoxのアイテムをユーザ...
-
jap実行時のTomcatのエラーに困...
-
特定の文字列が一致する行から...
-
マルチスレッドで同時にFTPアッ...
-
【Java8以降】csvファイルの複...
-
「指定されたキャストは有効で...
-
C#での関数テーブルの作り方
-
Delphiで改行文字の置換がうま...
-
ArrayListを改良したい
-
GridViewで複数のDropDownList...
-
strtokでの空文字への置き換え
-
C#でIPアドレスの取得について
-
c言語
-
C#での関数テーブルの作り方
-
GDI+ DrawString() で指定範囲...
-
PHPのSHA256変換について
-
C# JSONについて
-
XP+PHP+POSTGRES(SJIS)
-
C++のmap
おすすめ情報