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

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

【C言語】文字列による処理の分岐について

いつも丁寧な解説拝見しております。 C言語について質問させて頂きます。 シリアル通信によって受信した1バイトの文字列があるとします。 この文字列のパターンよって処理の分岐をさせたい場合、コードはどのように書けば良いのでしょうか。 より具体的に申しますと、 →文字列パターン1の場合、関数1を呼び出す。 →文字列パターン2の場合、関数2を呼び出す。 →文字列パターン3の場合、関数3を呼び出す。・・・・・・ と、100パターンほどの文字列があり、それぞれにおいて異なる関数を呼び出したいと考えております。私の理解は以下に示す通りなのですが、どうも正しい処理が分らないでいます。 ・受信した文字列がどのパターンなのかを判断するために、strcmp関数で比較を行う。 ・多分岐なので、switch case文かelse if文を用いる。 この場合、条件式の中でstrcmp関数による比較を行えば良いのでしょうか。簡単にコードを示して頂ければ幸いです。C言語初心者なので理解に間違いがあるかもしれませんが、どうぞよろしくお願い致します。

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

  • ベストアンサー
  • 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% (2126/6288)
回答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% (2126/6288)
回答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

  • C言語での文字列より値を抜き出す

    C言語初心者です。 たとえば、”ABCDE”という文字列があります。 その文字列の2桁目から3文字を取得したい場合、 どのようにすればよろしいでしょうか。  上記の場合、”BCD”が欲しい SQLだと、SUBSTR(B)関数がありますが、C言語には 同様な関数があるのでしょうか。 また、C++ではどうでしょうか。 お客さんに突然聞かれたので、本屋に行く余裕もありませんでした。 どなかた教えてください。お願いします。

  • C言語 文字列比較

    WindowsAppのコマンドライン引数はLPSTR型ですよね、コマンドライン引数が~だったら、というような条件分岐を作りたいのですが、strcmpは使えません。それで、どうすればいいのか分からなくなってしまい、質問しました。 WindowsAppではあるけど、コマンドラインオプションを使いたいのですが、どうやって文字列をしたらいいのでしょうか? もしstrcmpが使えたとしたら、こういうことをやりたいのです。 int WINAPI WinMain(・・・LPSTR pCmdLine, ・・・) // pCmdLineはコマンドライン引数です。 { ・・・ // 省略 if(strcmp(pCmdLine,"-s") == 0) { ・・・ } ・・・ return 0; } ・・・は省略です。 このようなことをできる関数はありませんか?

  • C言語 文字列 比較に関する質問

    C言語の文字列で数字を比較する場合以下の3パターンがあります  1.X > 5      2.X > ”5”   3.X > ’5’ あるchar属性の Yがあるとします  char Y;  Strncpy(Y,”5”);   YY=atoi(Y);    上記1は  X > Y  上記2は  X > YY となりますが  上記3のシングルコーテーションとして  比較する関数を教えてください    

  • c言語 文字列の比較

    ファイルから読み込んだ文字列と入力した文字列を比較して同じなら次の処理を行いたいんですが、入力が例えば同じ1212でもstrcmp()で181がかえってきます。原因は何なのでしょうか? #define BUFMAX=45;  char smsg[BUFMAX];  char pass[BUFMAX];  printf("pass=%s\n",pass); printf("smsg=%s\n",smsg); c=smsg; stc=strcmp(pass,c); passにはscanfで1212を読み込みます。 smsgにはfgetsでファイルから一行読み込みます。 テキストのなかみは1212が一行はいっています。 自分では全く見当がつかないので、回答していただける方がいれば、ヒントでもいいのでお願いします。

  • 文字列で条件分岐 if swtich

    C言語でifやswitch文の条件式でキーボード入力からの複数文字列(char型)に対して条件分岐をしたいのですが、どなたか具体例を教えていただけないでしょうか?またscanfでキーボード入力を読み込む場合、Enterを押さないと実行されませんが、Enterを押さないでもいい関数や方法があれば教えて下さい。宜しくお願いします。

  • Cの文字列比較で・・

    "abcdefghi"と"cde"を比較して3つの単語が一致すれば値を返すstrcmp,strncmpのような文字列比較関数は存在しないでしょうか? よろしくお願いします。

  • 大文字の文字列→小文字の文字列

    C言語初心者です。 ある演習問題をやっていて詰まっています。 自分で入力した大文字の文字列を小文字にするプログラムを作るという問題なのですが、↓の条件があり、こんがらがってしまいました。 ・入力した文字列に小文字が含まれていたら、エラーと表示して再び入力を促し、0を入力するとプログラム終了という流れにする。 ・ポインタ変数を使う。 ・continue文を使う。 ・標準ライブラリ関数は使わない。 です。 ・continue文というのがよくわからない。 ・宣言した関数でどの処理をすればいいのかわからない。 ・大文字を小文字にするというプログラムがわからない。 (アスキーコードをどう使うのか) でつまっています。 どなたかアドバイス・解説・模範解答・指摘などしていただけないでしょうか。 よろしくお願い致します。

  • C言語で文字列操作を忘れてしまいました。

    長い間スクリプト言語ばかりやっておりまして、C言語に戻ると、文字列を返す 関数を作ろうとしましたが、お恥ずかしいながらできませんでした。 ローカル変数の値を戻り値に使おうとして、それがwarningになったり、動作が不安定になったりして、文字列を返す仕組みを完全に忘れてしまっていました。 例えば、"test"と言う文字列を返す関数を書きたいのですが、メモリ操作も考えた サンプルをだれか教えて欲しいです。 int main(void) { printf("%s", 「関数名」); }

  • c言語がわかりません

    (1)数学関数(cos)を用いて、10度から50度まで10度刻みのcos値の表を表示するプログラムを作成。 数学関数のヘッダファイル:<math.h> cos関数:cos(ラディアン値) (double型) ラディアン値 r=d*(3.14159/180) (2)文字列の大小比較を行なうstrcmp関数を用いて、入力された2つの文字列の大小比較を行い、結果を表示するプログラムを作成。 strcmp関数形:int strcmp(a,b) a,bは文字列(文字配列) 戻り値:a<bなら負、a=bなら0,a>bなら正

  • C言語の文字列?処理 strcpyやlstrcpyなど

    C言語は簡単なものが書けるようになりましたが、 全体(C言語の歴史やWindows固有など)を知らないため、まだ右往左往しております。 文字列処理でstrcpyやlstrcpyなどlが付いてないものや付いているものなどがありますが、違いは何でしょうか? こういうレベルのひとがわかる(歴史や背景・Windows固有)など1冊で解説しているような書籍は無いと思いますが、お勧めのものがありましたら教えてください。 C言語はポインタ取得と言われますが、ポインタだけでなく文字列処理など具体的な例を挙げた、網羅されているC言語(構文でなく利用や応用にに重点を置いた解説書)を探しています。