为了账号安全,请及时绑定邮箱和手机立即绑定

在C中打开字符串的最佳方法

/ 猿问

在C中打开字符串的最佳方法

C
莫回无 2019-11-15 13:04:32

在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;

}

对于字符串值(即a),如何获得相同的行为(即避免所谓的“ if- else梯形图”)char *?


查看完整描述

3 回答

?
天天世纪

如果您的意思是,如何编写与此类似的内容:


// 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: */

{

}


查看完整回答
反对 回复 2019-11-15
?
侃侃尔雅

如果您有很多情况,并且不想写大量strcmp()电话,则可以执行以下操作:


switch(my_hash_function(the_string)) {

    case HASH_B1: ...

    /* ...etc... */

}

您只需要确保您的哈希函数在该字符串的可能值集中没有冲突。


查看完整回答
反对 回复 2019-11-15
?
吃鸡游戏

用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 */

}

当然,有更有效的方法可以做到这一点。如果对键进行排序,则可以使用二进制搜索。您也可以使用哈希表。这些事情以牺牲维护成本为代价来改变您的性能。


查看完整回答
反对 回复 2019-11-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信