dポイントプレゼントキャンペーン実施中!

いつも丁寧な解説拝見しております。
C言語について質問させて頂きます。

シリアル通信によって受信した1バイトの文字列があるとします。
この文字列のパターンよって処理の分岐をさせたい場合、コードはどのように書けば良いのでしょうか。

より具体的に申しますと、
→文字列パターン1の場合、関数1を呼び出す。
→文字列パターン2の場合、関数2を呼び出す。
→文字列パターン3の場合、関数3を呼び出す。・・・・・・

と、100パターンほどの文字列があり、それぞれにおいて異なる関数を呼び出したいと考えております。私の理解は以下に示す通りなのですが、どうも正しい処理が分らないでいます。

・受信した文字列がどのパターンなのかを判断するために、strcmp関数で比較を行う。
・多分岐なので、switch case文かelse if文を用いる。

この場合、条件式の中でstrcmp関数による比較を行えば良いのでしょうか。簡単にコードを示して頂ければ幸いです。C言語初心者なので理解に間違いがあるかもしれませんが、どうぞよろしくお願い致します。

A 回答 (5件)

文字列の種類が100種類あると、if文の羅列では一回の検索で平均して50回のstrcmp関数を実行する必要があります。

良く出現する文字列の検索を前方におけば回数を少なくすることは可能だと思いますが…。
二分検索を行うと最大で7回に抑えることができます。

文字列ポインタと関数ポインタを格納した構造体の配列をqsortで整列させておいて、bsearchで二分検索して一致する文字列があれば対応する関数を実行する感じです。

#include <stdlib.h>
#include <string.h>

#defineN5

struct s {
char*str ;
int (*f)(void) ;
} ;

chars0 [] = "abc" ;
chars1 [] = "de" ;
chars2 [] = "fghi" ;
chars3 [] = "opq" ;
chars4 [] = "jklmn" ;

intf0 (void) {printf ("f0実行\n") ;return 0 ;}
intf1 (void) {printf ("f1実行\n") ;return 0 ;}
intf2 (void) {printf ("f2実行\n") ;return 0 ;}
intf3 (void) {printf ("f3実行\n") ;return 0 ;}
intf4 (void) {printf ("f4実行\n") ;return 0 ;}

struct s st [N] = {
{s0, f0},
{s1, f1},
{s2, f2},
{s3, f3},
{s4, f4},
} ;

intcomp (const void *a, const void *b)
{
return strcmp (((struct s*) a)->str, ((struct s*) b)->str) ;
}

intsearch_do (char *mojiretu)
{
struct ssa,*sp ;
intrtn = 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;
}
    • good
    • 0

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


switch文でも扱えますし。
    • good
    • 0

おっと失礼。

バグがありました。

printf("%sです。\n");
printf("%sだよ。\n");
printf("%sでっせ。\n");

はすべて間違いです。

printf("%sです。\n", s);
printf("%sだよ。\n", s);
printf("%sでっせ。\n", s);
    • good
    • 0

→文字列パターン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;
}
    • good
    • 0

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

    • good
    • 0

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