• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【C言語】文字列による処理の分岐について)

【C言語】文字列による処理の分岐方法

このQ&Aのポイント
  • C言語で文字列のパターンによる処理の分岐方法について質問です。受信した文字列のパターンに応じて異なる関数を呼び出したい場合、どのようにコードを書けば良いでしょうか。条件式の中でstrcmp関数を用いて比較を行うことで、分岐処理を実現することができます。
  • C言語でシリアル通信によって受信した文字列のパターンに応じた処理の分岐方法について質問です。異なる文字列パターンに応じて異なる関数を呼び出したい場合、strcmp関数を使って条件式の中で比較を行うことができます。具体的なコード例がわかると助かります。
  • C言語で文字列のパターンに応じた処理の分岐方法について質問です。受信した文字列がどのパターンなのかを判断するためにstrcmp関数を使用し、それに応じて異なる関数を呼び出したいと思っています。具体的なコード例を教えていただけると助かります。

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

  • ベストアンサー
  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.4

文字列の種類が100種類あると、if文の羅列では一回の検索で平均して50回のstrcmp関数を実行する必要があります。良く出現する文字列の検索を前方におけば回数を少なくすることは可能だと思いますが…。 二分検索を行うと最大で7回に抑えることができます。 文字列ポインタと関数ポインタを格納した構造体の配列をqsortで整列させておいて、bsearchで二分検索して一致する文字列があれば対応する関数を実行する感じです。 #include <stdlib.h> #include <string.h> #define N 5 struct s { char *str ; int (*f)(void) ; } ; char s0 [] = "abc" ; char s1 [] = "de" ; char s2 [] = "fghi" ; char s3 [] = "opq" ; char s4 [] = "jklmn" ; int f0 (void) {printf ("f0実行\n") ; return 0 ;} int f1 (void) {printf ("f1実行\n") ; return 0 ;} int f2 (void) {printf ("f2実行\n") ; return 0 ;} int f3 (void) {printf ("f3実行\n") ; return 0 ;} int f4 (void) {printf ("f4実行\n") ; return 0 ;} struct s st [N] = { {s0, f0}, {s1, f1}, {s2, f2}, {s3, f3}, {s4, f4}, } ; int comp (const void *a, const void *b) { return strcmp (((struct s*) a)->str, ((struct s*) b)->str) ; } int search_do (char *mojiretu) { struct s sa, *sp ; int rtn = 0 ; sa.str = mojiretu ; sp = (struct s*) bsearch (&sa, st, N, sizeof (struct s), comp) ; if (sp != NULL) { sp ->f () ; } else { printf ("一致文字列なし\n") ; rtn = 1 ; } return rtn ; } int main(void) { qsort (st, N, sizeof (struct s), comp) ; search_do ("fghi") ; search_do ("fgh") ; return 0; }

その他の回答 (4)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

「1バイトの文字列」だったら、単純にコードを数値で比較すればstrcmpなんて使用しないで済みますね。 switch文でも扱えますし。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

おっと失礼。バグがありました。 printf("%sです。\n"); printf("%sだよ。\n"); printf("%sでっせ。\n"); はすべて間違いです。 printf("%sです。\n", s); printf("%sだよ。\n", s); printf("%sでっせ。\n", s);

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

→文字列パターン1の場合、関数1を呼び出す。 →文字列パターン2の場合、関数2を呼び出す。 →文字列パターン3の場合、関数3を呼び出す。・・・・・・ 呼び出す関数群の引数の並びが同じであるならば、 関数ポインターを使って #include <stdio.h> #include <string.h> typedef void (*func)(char *s); void f0(char *s) { printf("%sです。\n"); } void f1(char *s) { printf("%sだよ。\n"); } void f2(char *s) { printf("%sでっせ。\n"); } void f3(void) { printf("どれでもないよ。\n"); } int main(void) { char *s[] = { "abc", "def", "ghi" }, p[4]; func f[] = { f0, f1, f2 }; int i; while (1) { printf("3文字の文字列を入力(zzzで終了) > "); scanf("%3s", p); if (strcmp(p, "zzz") == 0) { break; } for (i = 0; i < sizeof(s)/ sizeof(s[0]); i++) { if (strcmp(p, s[i]) == 0) { (*f[i])(p); break; } } if (i == sizeof(s)/ sizeof(s[0])) { f3(); } } return 0; }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「1バイトの文字列」ってどういうこと?

関連するQ&A