`switch`ステートメントを使用してCの文字列を比較するにはどうすればよいですか?


84

Cにはswitch、テスト整数値に基づいてコードのさまざまな条件分岐を実行できるようにする構造があります。

int a;
/* Read the value of "a" from some source, e.g. user input */
switch (a) {
  case 100:
    // Code
    break;
  case 200:
    // Code
    break;
  default:
    // Code
    break;
}

文字列値、つまり?に対して同じ動作を取得する(つまり、いわゆる「if-elseラダー」を回避する)にはどうすればよいchar *ですか?


「スイッチオン」とはどういう意味ですか?
kennytm 2010年

あなたが実際に何をしようとしているのか(または尋ねているのか)が明確になるように再定式化してください。
サイモン・トス

8
OPはおそらく、switchステートメントのパラメーターとして文字列を使用したいと考えています。私の知る限り、これは不可能です。
dandan78 2010年

回答:


101

あなたが意味するなら、これに似たものを書く方法:

// switch statement
switch (string) {
  case "B1": 
    // do something
    break;
  /* more case "xxx" parts */
}

次に、Cの標準的な解決策は、if-elseラダーを使用することです。

if (strcmp(string, "B1") == 0) 
{
  // do something
} 
else if (strcmp(string, "xxx") == 0)
{
  // do something else
}
/* more else if clauses */
else /* default: */
{
}

1
実際、問題は、すでにintのスイッチがあり、特別な場合には、同じスイッチで使用したい値「B1」と「B2」があることです。唯一の方法は、「B1」と「B2」の値を何らかの方法で変換してintとして使用することです!!?
Niklas

2
@Niklas:これはあなたの質問にとって重要な情報です。質問を更新して、(可能であれば(擬似)コードを使用して)何をしようとしているのかを説明できますか?
Bart van Ingen Schenau 2010年

4
@Niklas:質問を明確にする必要があります。いったいどうして「B1」と「B2」がintの特殊なケースになるのでしょうか。
エドガーボネット2010年

1
#define A 1 #define B 2 #define C S1 #define D S2これらの値は、スイッチで使用したい値です。とてもシンプルです:
Niklas

5
@Niklas:定義は文字列ではありません。定義が数値用の場合、このようにスイッチで直接使用できますswitch (something) { case A: /*...*/ break; case B: /*...*/ break; }
Bart van Ingen Schenau 2010年

45

多くの場合があり、大量のstrcmp()呼び出しを書きたくない場合は、次のようなことを行うことができます。

switch(my_hash_function(the_string)) {
    case HASH_B1: ...
    /* ...etc... */
}

文字列の可能な値のセット内でハッシュ関数に衝突がないことを確認する必要があります。


8
「文字列の可能な値のセット内でハッシュ関数に衝突がないことを確認してください。」-そのようなハッシュ関数はアルファベットに存在します[a-zA-Z0-9_]か?例はありますか?
アルン

8
@ArunSaha:明らかに、そのような文字の任意の組み合わせではありません。
エドガーボネット2010年

3
固定長の文字列キーを使用する場合は、それぞれを一意の整数に変換できます。衝突はあり得ません。
エンジニア

@ArcaneEngineerええと...質問が解決しようとしている正確な問題ではありませんか?文字列のみが与えられた場合、それに合わせて整数をどのように選択しますか?「スイッチを使用するか、if / elseラダーを使用する」または、4文字のような非常に短いものを意味しますか?
ebyrob 2018

@ebyrob私はuint、ビットが8つの1バイトASCIIとして扱われる2つの64ビットなど、クイック操作で同等のものを意味しましたchar。これは、Cのハッシュテーブル内のキー比較のために、少し前に実装しました。したがって、ハッシュやバケットの必要性をなくすことができます。問題は、64ビットを超える必要がある場合に発生します。次にchar、完全な文字列の8の各セットをループするときに、条件のコストを支払います。キーの最大サイズがわかっている場合は、ループを展開しない限り。それは微妙なバランスを取る行為です。
エンジニア

39

Cではこれを行う方法はありません。さまざまなアプローチがあります。通常、最も簡単なのは、文字列を表す定数のセットを定義し、文字列でルックアップして定数を取得することです。

#define BADKEY -1
#define A1 1
#define A2 2
#define B1 3
#define B2 4

typedef struct { char *key; int val; } t_symstruct;

static t_symstruct lookuptable[] = {
    { "A1", A1 }, { "A2", A2 }, { "B1", B1 }, { "B2", B2 }
};

#define NKEYS (sizeof(lookuptable)/sizeof(t_symstruct))

int keyfromstring(char *key)
{
    int i;
    for (i=0; i < NKEYS; i++) {
        t_symstruct *sym = lookuptable[i];
        if (strcmp(sym->key, key) == 0)
            return sym->val;
    }
    return BADKEY;
}

/* ... */
switch (keyfromstring(somestring)) {
case A1: /* ... */ break;
case A2: /* ... */ break;
case B1: /* ... */ break;
case B2: /* ... */ break;
case BADKEY: /* handle failed lookup */
}

もちろん、これを行うためのより効率的な方法があります。キーを並べ替えたままにしておくと、バイナリ検索を使用できます。ハッシュテーブルを使用することもできます。これらのことは、メンテナンスを犠牲にしてパフォーマンスを変更します。


7
キーに#defineのセットの代わりに列挙型を使用する方がはるかに優れていますが、それ以外の場合は、できる限り最善の方法です。
クレイグリンガー

増分が正しくありません。lookuptable + i * sizeof(t_symstruct)はlookuptable [i]と等しくありません。
空自

@asdfこれがcでのポインタ演算の仕組みです。sizeofは暗黙的です。
ijustlovemath

20

これを行うための私の好ましい方法は、ハッシュ関数(ここから借用)を使用することです。これにより、char *を使用する場合でも、switchステートメントの効率を利用できます。

#include "stdio.h"

#define LS 5863588
#define CD 5863276
#define MKDIR 210720772860
#define PWD 193502992

const unsigned long hash(const char *str) {
    unsigned long hash = 5381;  
    int c;

    while ((c = *str++))
        hash = ((hash << 5) + hash) + c;
    return hash;
}

int main(int argc, char *argv[]) {
    char *p_command = argv[1];
    switch(hash(p_command)) {
    case LS:
        printf("Running ls...\n");
        break;
    case CD:
        printf("Running cd...\n");
        break;
    case MKDIR:
        printf("Running mkdir...\n");
        break;
    case PWD:
        printf("Running pwd...\n");
        break;
    default:
        printf("[ERROR] '%s' is not a valid command.\n", p_command);
    }
}

もちろん、このアプローチでは、受け入れられる可能性のあるすべてのchar *のハッシュ値を事前に計算する必要があります。これはそれほど問題ではないと思います。ただし、switchステートメントは固定値で動作するためです。ハッシュ関数を介してchar *を渡し、その結果を出力する簡単なプログラムを作成できます。これらの結果は、上記で行ったようにマクロを介して定義できます。


StackOverflowへようこそ。あなたが示したものは見事に提示されており、良いアイデアですが、…しかし、他のいくつかの回答とそれほど明確に異なるわけではありません。このアイデアにマイナーなバリエーションを使用するものがいくつかあります。古い安定した質問に新しい答えを追加する場合は、良い新しい情報があることを確信する必要があります。これは主に注意の言葉です。私は確かにこれに反対票を投じるつもりはありません。
ジョナサンレフラー2016年

16

これを行う最良の方法は、「認識」を機能から分離することだと思います。

struct stringcase { char* string; void (*func)(void); };

void funcB1();
void funcAzA();

stringcase cases [] = 
{ { "B1", funcB1 }
, { "AzA", funcAzA }
};

void myswitch( char* token ) {
  for( stringcases* pCase = cases
     ; pCase != cases + sizeof( cases ) / sizeof( cases[0] )
     ; pCase++ )
  {
    if( 0 == strcmp( pCase->string, token ) ) {
       (*pCase->func)();
       break;
    }
  }

}

8

Cの文字列の切り替えを実行するヘッダーファイルを公開しました。これには、切り替えのような動作を模倣するために、strcmp()(または同様のもの)の呼び出しを非表示にするマクロのセットが含まれています。LinuxのGCCでのみテストしましたが、他の環境をサポートするように適応できると確信しています。

編集:要求に応じて、ここにコードを追加しました

これは、インクルードする必要のあるヘッダーファイルです。

#ifndef __SWITCHS_H__
#define __SWITCHS_H__

#include <string.h>
#include <regex.h>
#include <stdbool.h>

/** Begin a switch for the string x */
#define switchs(x) \
    { char *__sw = (x); bool __done = false; bool __cont = false; \
        regex_t __regex; regcomp(&__regex, ".*", 0); do {

/** Check if the string matches the cases argument (case sensitive) */
#define cases(x)    } if ( __cont || !strcmp ( __sw, x ) ) \
                        { __done = true; __cont = true;

/** Check if the string matches the icases argument (case insensitive) */
#define icases(x)    } if ( __cont || !strcasecmp ( __sw, x ) ) { \
                        __done = true; __cont = true;

/** Check if the string matches the specified regular expression using regcomp(3) */
#define cases_re(x,flags) } regfree ( &__regex ); if ( __cont || ( \
                              0 == regcomp ( &__regex, x, flags ) && \
                              0 == regexec ( &__regex, __sw, 0, NULL, 0 ) ) ) { \
                                __done = true; __cont = true;

/** Default behaviour */
#define defaults    } if ( !__done || __cont ) {

/** Close the switchs */
#define switchs_end } while ( 0 ); regfree(&__regex); }

#endif // __SWITCHS_H__

そして、これはあなたがそれを使用する方法です:

switchs(argv[1]) {
    cases("foo")
    cases("bar")
        printf("foo or bar (case sensitive)\n");
        break;

    icases("pi")
        printf("pi or Pi or pI or PI (case insensitive)\n");
        break;

    cases_re("^D.*",0)
        printf("Something that start with D (case sensitive)\n");
        break;

    cases_re("^E.*",REG_ICASE)
        printf("Something that start with E (case insensitive)\n");
        break;

    cases("1")
        printf("1\n");
        // break omitted on purpose

    cases("2")
        printf("2 (or 1)\n");
        break;

    defaults
        printf("No match\n");
        break;
} switchs_end;

「ブレーク」を追加するのではなく、省略できるという事実を強調して例を編集しました
Andrea Carron

1
それはいいです!「sscanf」を使用して照合する前に、「regex.h」を学習しました。これは、文字列の場合に
最適です

スイッチ/ケースと比較して、なんと美しいソリューションであり、読みやすく、はるかに多くの機能を備えています-ありがとう!角かっこを閉じた後は、「switches_end:」を忘れないでください。
アキム

6

文字列検索をより高速に実行する方法があります。仮定:switchステートメントについて話しているので、実行時に値が変更されないと仮定できます。

アイデアは、Cstdlibのqsortとbsearchを使用することです。

xtoflのコードに取り組んでいます。

struct stringcase { char* string; void (*func)(void); };

void funcB1();
void funcAzA();

struct stringcase cases [] = 
{ { "B1", funcB1 }
, { "AzA", funcAzA }
};

struct stringcase work_cases* = NULL;
int work_cases_cnt = 0;

// prepare the data for searching
void prepare() {
  // allocate the work_cases and copy cases values from it to work_cases
  qsort( cases, i, sizeof( struct stringcase ), stringcase_cmp );
}

// comparator function
int stringcase_cmp( const void *p1, const void *p2 )
{
  return strcasecmp( ((struct stringcase*)p1)->string, ((struct stringcase*)p2)->string);
}

// perform the switching
void myswitch( char* token ) {
  struct stringcase val;
  val.string=token;
  void* strptr = bsearch( &val, work_cases, work_cases_cnt, sizeof( struct stringcase), stringcase_cmp );
  if (strptr) {
    struct stringcase* foundVal = (struct stringcase*)strptr;
    (*foundVal->func)();
    return OK;
  }
  return NOT_FOUND;
}

6

上記のPhimuemeの回答に追加するには、文字列が常に2文字の場合、2つの8ビット文字から16ビットintを作成し、それをオンにします(ネストされたswitch / caseステートメントを回避するため)。


本当にやりたい場合To add to Phimueme's answer aboveは、コメント機能をご利用ください。:)
オニオン-ナイト

3
@Onion:MikeBromは現在、自分以外の投稿にコメントしたり、自分の質問に答えたりするという評判がないことに気付くでしょう。とは言うものの、信頼できるソート順がないため、@ Mike「上記」はSOでは滑りやすいです。「... Phimuemeの回答で...」ような回答にリンクすることをお勧めします(ただし、その回答は現在削除されており、リンクは10k以上の評判を持つユーザーにのみ有効です)。
dmckee ---元モデレーターの子猫2010

3

文字列を他の文字列と比較するためにif-elseラダーをエスケープすることはできません。通常のswitch-caseでさえ、内部的にはif-elseラダー(整数の場合)でもあります。文字列のswitch-caseのみをシミュレートしたい場合がありますが、if-elseラダーを置き換えることはできません。文字列比較のための最良のアルゴリズムは、strcmp関数の使用から逃れることはできません。不一致が見つかるまで文字ごとに比較することを意味します。したがって、if-elseラダーとstrcmpの使用は避けられません。

デモ

そして、これが文字列のswitch-caseをシミュレートするための最も単純なマクロです。

#ifndef SWITCH_CASE_INIT
#define SWITCH_CASE_INIT
    #define SWITCH(X)   for (char* __switch_p__ = X, int __switch_next__=1 ; __switch_p__ ; __switch_p__=0, __switch_next__=1) { {
    #define CASE(X)         } if (!__switch_next__ || !(__switch_next__ = strcmp(__switch_p__, X))) {
    #define DEFAULT         } {
    #define END         }}
#endif

そして、あなたはそれらをとして使うことができます

char* str = "def";

SWITCH (str)
    CASE ("abc")
        printf ("in abc\n");
        break;
    CASE ("def")              // Notice: 'break;' statement missing so the control rolls through subsequent CASE's until DEFAULT 
        printf("in def\n");
    CASE ("ghi")
        printf ("in ghi\n");
    DEFAULT
        printf("in DEFAULT\n");
END

出力:

in def
in ghi
in DEFAULT

以下はネストされたSWITCHの使用法です。

char* str = "def";
char* str1 = "xyz";

SWITCH (str)
    CASE ("abc")
        printf ("in abc\n");
        break;
    CASE ("def")                                
        printf("in def\n");
        SWITCH (str1)                           // <== Notice: Nested SWITCH
            CASE ("uvw")
                printf("in def => uvw\n");
                break;
            CASE ("xyz")
                printf("in def => xyz\n");
                break;
            DEFAULT
                printf("in def => DEFAULT\n");
        END
    CASE ("ghi")
        printf ("in ghi\n");
    DEFAULT
        printf("in DEFAULT\n");
END

出力:

in def
in def => xyz
in ghi
in DEFAULT

これが逆文字列SWITCHで、CASE句で(定数ではなく)変数を使用できます。

char* str2 = "def";
char* str3 = "ghi";

SWITCH ("ghi")                      // <== Notice: Use of variables and reverse string SWITCH.
    CASE (str1)
        printf ("in str1\n");
        break;
    CASE (str2)                     
        printf ("in str2\n");
        break;
    CASE (str3)                     
        printf ("in str3\n");
        break;
    DEFAULT
        printf("in DEFAULT\n");
END

出力:

in str3

「通常のswitch-caseでさえ、内部的には(整数の)if-elseラダーでもあります」それは真実ではありません。可能であれば、コンパイラーはジャンプテーブルを生成します。これははるかに効率的です。stackoverflow.com/a/14067661/4990392
Dada

2

これは一般的に私がそれを行う方法です。

void order_plane(const char *p)
{
    switch ((*p) * 256 + *(p+1))
    {
        case 0x4231 : /* B1 */
        {
           printf("Yes, order this bomber.  It's a blast.\n");
           break;
        }

        case 0x5354 : /* ST */
        {
            printf("Nah.  I just can't see this one.\n");
            break;
        }

        default :
        {
            printf("Not today.  Can I interest you in a crate of SAMs?\n";
        }
    }
}

面白い。(おそらく選択によって)防御的なコーディングが不足している。そして、念のために追加の中括弧を賞賛します。コードを非常に読みやすくします(ただし、大文字と小文字を区別するためにエジプトの中括弧を使用します)。
ダリウス

1
ところで、大文字と小文字のラベルには定数式を使用できます。case 'B'<<8+'1':これは0x4231よりも明確になると思います。
イェンス

マクロを使用します。#define twochar(a) (((uint16_t)a[1]<<8)|a[0])
v7d8dpo4 2016年

1

これがあなたのやり方です。いいえ、そうではありません。

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdint.h>


 #define p_ntohl(u) ({const uint32_t Q=0xFF000000;       \
                     uint32_t S=(uint32_t)(u);           \
                   (*(uint8_t*)&Q)?S:                    \
                   ( (S<<24)|                            \
                     ((S<<8)&0x00FF0000)|                \
                     ((S>>8)&0x0000FF00)|                \
                     ((S>>24)&0xFF) );  })

main (void)
{
    uint32_t s[0x40]; 
    assert((unsigned char)1 == (unsigned char)(257));
    memset(s, 0, sizeof(s));
    fgets((char*)s, sizeof(s), stdin);

    switch (p_ntohl(s[0])) {
        case 'open':
        case 'read':
        case 'seek':
            puts("ok");
            break;
        case 'rm\n\0':
            puts("not authorized");
            break;
        default:
            puts("unrecognized command");  
    }
    return 0;
}

3
私は、これは標準C.だとは思わない
ヨハンKotlinski

2
マクロが混合エンディアンをサポートするようにするか、関数を読者の演習として残します。

2
標準Cですが、ポータブルではありません。マルチバイト文字のバイト順序は「実装依存」であり、マシンのバイト順序を反映する必要はありません。私はそれを使用一度焼けてしまった:Solaris SPARCの(ビッグエンディアン)Sunstudio 12よりもGNU-C 3.4用途別のバイト順に
パトリックSchlüter

@tristopiaあなたはもちろん正しいです(実際にこのようなことをしようとした後、できる限り正しいです)。これが、私たち全員が代わりにBを使用する必要がある理由です。

なぜあなたはあなたのアカウントを殺したのですか?

1

2バイトの文字列の場合は、ISO639-2言語コードをオンにするこの具体的な例のように実行できます。

    LANIDX_TYPE LanCodeToIdx(const char* Lan)
    {
      if(Lan)
        switch(Lan[0]) {
          case 'A':   switch(Lan[1]) {
                        case 'N': return LANIDX_AN;
                        case 'R': return LANIDX_AR;
                      }
                      break;
          case 'B':   switch(Lan[1]) {
                        case 'E': return LANIDX_BE;
                        case 'G': return LANIDX_BG;
                        case 'N': return LANIDX_BN;
                        case 'R': return LANIDX_BR;
                        case 'S': return LANIDX_BS;
                      }
                      break;
          case 'C':   switch(Lan[1]) {
                        case 'A': return LANIDX_CA;
                        case 'C': return LANIDX_CO;
                        case 'S': return LANIDX_CS;
                        case 'Y': return LANIDX_CY;
                      }
                      break;
          case 'D':   switch(Lan[1]) {
                        case 'A': return LANIDX_DA;
                        case 'E': return LANIDX_DE;
                      }
                      break;
          case 'E':   switch(Lan[1]) {
                        case 'L': return LANIDX_EL;
                        case 'N': return LANIDX_EN;
                        case 'O': return LANIDX_EO;
                        case 'S': return LANIDX_ES;
                        case 'T': return LANIDX_ET;
                        case 'U': return LANIDX_EU;
                      }
                      break;
          case 'F':   switch(Lan[1]) {
                        case 'A': return LANIDX_FA;
                        case 'I': return LANIDX_FI;
                        case 'O': return LANIDX_FO;
                        case 'R': return LANIDX_FR;
                        case 'Y': return LANIDX_FY;
                      }
                      break;
          case 'G':   switch(Lan[1]) {
                        case 'A': return LANIDX_GA;
                        case 'D': return LANIDX_GD;
                        case 'L': return LANIDX_GL;
                        case 'V': return LANIDX_GV;
                      }
                      break;
          case 'H':   switch(Lan[1]) {
                        case 'E': return LANIDX_HE;
                        case 'I': return LANIDX_HI;
                        case 'R': return LANIDX_HR;
                        case 'U': return LANIDX_HU;
                      }
                      break;
          case 'I':   switch(Lan[1]) {
                        case 'S': return LANIDX_IS;
                        case 'T': return LANIDX_IT;
                      }
                      break;
          case 'J':   switch(Lan[1]) {
                        case 'A': return LANIDX_JA;
                      }
                      break;
          case 'K':   switch(Lan[1]) {
                        case 'O': return LANIDX_KO;
                      }
                      break;
          case 'L':   switch(Lan[1]) {
                        case 'A': return LANIDX_LA;
                        case 'B': return LANIDX_LB;
                        case 'I': return LANIDX_LI;
                        case 'T': return LANIDX_LT;
                        case 'V': return LANIDX_LV;
                      }
                      break;
          case 'M':   switch(Lan[1]) {
                        case 'K': return LANIDX_MK;
                        case 'T': return LANIDX_MT;
                      }
                      break;
          case 'N':   switch(Lan[1]) {
                        case 'L': return LANIDX_NL;
                        case 'O': return LANIDX_NO;
                      }
                      break;
          case 'O':   switch(Lan[1]) {
                        case 'C': return LANIDX_OC;
                      }
                      break;
          case 'P':   switch(Lan[1]) {
                        case 'L': return LANIDX_PL;
                        case 'T': return LANIDX_PT;
                      }
                      break;
          case 'R':   switch(Lan[1]) {
                        case 'M': return LANIDX_RM;
                        case 'O': return LANIDX_RO;
                        case 'U': return LANIDX_RU;
                      }
                      break;
          case 'S':   switch(Lan[1]) {
                        case 'C': return LANIDX_SC;
                        case 'K': return LANIDX_SK;
                        case 'L': return LANIDX_SL;
                        case 'Q': return LANIDX_SQ;
                        case 'R': return LANIDX_SR;
                        case 'V': return LANIDX_SV;
                        case 'W': return LANIDX_SW;
                      }
                      break;
          case 'T':   switch(Lan[1]) {
                        case 'R': return LANIDX_TR;
                      }
                      break;
          case 'U':   switch(Lan[1]) {
                        case 'K': return LANIDX_UK;
                        case 'N': return LANIDX_UN;
                      }
                      break;
          case 'W':   switch(Lan[1]) {
                        case 'A': return LANIDX_WA;
                      }
                      break;
          case 'Z':   switch(Lan[1]) {
                        case 'H': return LANIDX_ZH;
                      }
                      break;
        }
      return LANIDX_UNDEFINED;
    }

LANIDX_ *は、配列のインデックス作成に使用される定数整数です。


0

エンディアンが少なく、sizeof(char)== 1であると仮定すると、それを行うことができます(このようなものは、MikeBromによって提案されました)。

char* txt = "B1";
int tst = *(int*)txt;
if ((tst & 0x00FFFFFF) == '1B')
    printf("B1!\n");

BEの場合は一般化できます。


2
それをしないでください!これにより、「データアライメント」例外が発生する可能性があります。char * txtが、intの配置要件に一致するアドレスを指すことは保証されていません。
ハーパー2010年

@R彼はそれを求めた。@ harperx86の場合はそうではありません。
ruslik 2010年

Niklasはx86を要求しませんでした。そして、ビッグエンディアンのケースについて言及したので、x86環境だけに対処するわけではありません。つまり、 '
harper 2010年

さらに、マルチバイト文字は必ずしもマシンのバイト順である必要はありません。jbcreixの回答に対する私のコメントを参照してください。
パトリックSchlüter

0

関数ポインタはこれを行うための優れた方法です。

result = switchFunction(someStringKey); //result is an optional return value

...これは、文字列キーで設定した関数を呼び出します(ケースごとに1つの関数):

setSwitchFunction("foo", fooFunc);
setSwitchFunction("bar", barFunc);

khashなどの既存のハッシュマップ/テーブル/ディクショナリ実装を使用し、そのポインタを内部の関数にswitchFunction()返しswitchFunction()、実行します(または、から返し、自分で実行します)。マップの実装にそれが保存されていない場合は、uint64_t代わりに、ポインターに応じてキャストする代わりに使用してください。


@ eri0oまともだと思ったら、賛成してみませんか?元の反対票はずっとなくなっています。
エンジニア

-2

こんにちはこれはあなたがこの場合を持っているなら簡単で速い方法です:

【クイックモード】

int concated;
char ABC[4]="";int a=1,b=4,c=2;            //char[] Initializing
ABC<-sprintf(ABC,"%d%d%d",a,b,c);          //without space between %d%d%d
printf("%s",ABC);                          //value as char[] is =142
concated=atoi(ABC);                        //result is 142 as int, not 1,4,2 (separeted)

//now use switch case on 142 as an integer and all possible cases

【EXPLAINEDモード】

例:私にはたくさんのメニューがあり、1番目のメニューの各選択は2番目のメニューに移動します。2番目のメニューと3番目のメニューと同じですが、オプションが異なるため、ユーザーが最終的に選択したことがわかります。例:

メニュー1:1 ==>メニュー2:4 ==>メニュー3:2(...)選択肢は142です。その他の場合:111,141,131,122 .. ..

解決策:最初の1番目をaに、2番目をbに、3番目をcに格納します。a = 1、b = 4、c = 2

 char ABC[4]="";
 ABC<-sprintf(ABC,"%d%d%d",a,b,c);              //without space between %d%d%d
 printf("%s",ABC);                              //value as char[]=142

      //now you want to recover your value(142) from char[] to int as  int value 142

 concated=atoi(ABC);                            //result is 142 as int, not 1,4,2 (separeted)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.