免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yecheng_110
打印 上一主题 下一主题

多个strcmp比较的时候大家是怎么做的? [复制链接]

论坛徽章:
0
31 [报告]
发表于 2008-01-08 10:56 |只看该作者
原帖由 ivhb 于 2007-7-17 09:47 发表


一般来说,罗列(并且很多)这样的结构都可以通过仔细设计,适应表驱动法。
比如你可以
struct  {
  const char *name;
  int (*action)(void);
};

通过这个配置就可以把特征码和对应动作捆绑,如果 ...

如果有一百多种选者,就要一百多个函数?
struct A{
    const char szName[64];
    int (*action)(void);
};
char buf[1024] = "hello world";
    if(strcmp(buf, str1) == 0) {
        return 1;
    } else if(strcmp(buf, str2) == 0) {
        return 2;
    } else {
        ...
    }

难道我要这样?
int func1(){return 1;}
int func2(){return 2;}
A array[100] = {{str1,func1},{str2,func2}...};

[ 本帖最后由 yjm0573 于 2008-1-8 11:02 编辑 ]

论坛徽章:
0
32 [报告]
发表于 2008-01-08 11:15 |只看该作者
弱问一下

__FILE__   __LINE__

这样的宏在那里定义, 啥意思  文件?行

论坛徽章:
0
33 [报告]
发表于 2008-01-08 11:18 |只看该作者
原帖由 lxy9805287 于 2008-1-8 11:15 发表
弱问一下

__FILE__   __LINE__

这样的宏在那里定义, 啥意思  文件?行

文件名,行号,类似的还有函数名__func__

论坛徽章:
0
34 [报告]
发表于 2008-01-08 11:18 |只看该作者
原帖由 lxy9805287 于 2008-1-8 11:15 发表
弱问一下

__FILE__   __LINE__

这样的宏在那里定义, 啥意思  文件?行

编译的时候内置的宏就是代码所在的文件和行号

论坛徽章:
0
35 [报告]
发表于 2008-01-08 11:21 |只看该作者
多谢楼上, 楼上.

论坛徽章:
0
36 [报告]
发表于 2008-01-08 14:57 |只看该作者
原帖由 yjm0573 于 2008-1-8 10:56 发表

如果有一百多种选者,就要一百多个函数?
struct A{
    const char szName[64];
    int (*action)(void);
};
char buf[1024] = "hello world";
    if(strcmp(buf, str1) == 0) {
        return 1; ...


好像是的,这种方法的好处是程序可读性强,且维护方便
但我在用此方法时,为了避免用strcmp比较字符串,会增加一个整数的键值,比较的时候直接比较整数,那样更快
结构体这样定义
struct A {
  const char* Name;
  int Key;
  int (*ActPtr)(void);
};

struct A a[] = {
{"Name one", 1, Act1},
{"Name two", 2, Act2},
...
};


不知谁有更好的方法

论坛徽章:
0
37 [报告]
发表于 2008-01-08 17:56 |只看该作者
原帖由 kangji 于 2008-1-8 14:57 发表


好像是的,这种方法的好处是程序可读性强,且维护方便
但我在用此方法时,为了避免用strcmp比较字符串,会增加一个整数的键值,比较的时候直接比较整数,那样更快
结构体这样定义
struct A {
  const c ...

这个优化有必要么?
如果不是性能瓶颈,引入新的键值似乎得不偿失?
比如以后,要对表增加,或删除字符串时,还得维护一个键值

我一般都直接用 hash 表,冲突的再逐个 strcmp
考虑到冲突的频率不高(高的话就得换 hash 算法了), 没有必要为了这么点再优化

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
38 [报告]
发表于 2008-01-08 18:28 |只看该作者
能用c++么?


class handler_base {
public:
    virtual void process(PARAMETER &param) = 0;
};
typedef map<string, handler_base *> _HANDLER_MAP;

...
class C_Handler_A :public handler_base {
    void process(PARAMETER &param) {
        ...
    }
};
...
_HANDLER_MAP g_handler;

void function1 (...)
{
    ...
    g_handler.insert(value1, new C_Handler_A);
    ...
}
void function2(...)
{
    ...
    _HANDLER_MAP it = g_handler.find(value1);
    if ( it != g_handler.end() ) it->second->process(parameter);
    ...
}

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
39 [报告]
发表于 2008-01-17 09:46 |只看该作者

  1. switch (*method) {
  2.         case 'H':
  3.            if (strcmp(method, "HEAD") == 0)
  4.                return M_GET;   /* see header_only in request_rec */
  5.            break;
  6.         case 'G':
  7.            if (strcmp(method, "GET") == 0)
  8.                return M_GET;
  9.            break;
  10.         case 'P':
  11.            if (strcmp(method, "POST") == 0)
  12.                return M_POST;
  13.            if (strcmp(method, "PUT") == 0)
  14.                return M_PUT;
  15.            if (strcmp(method, "PATCH") == 0)
  16.                return M_PATCH;
  17.            if (strcmp(method, "PROPFIND") == 0)
  18.                return M_PROPFIND;
  19.            if (strcmp(method, "PROPPATCH") == 0)
  20.                return M_PROPPATCH;
  21.            break;
  22.         case 'D':
复制代码

其实apache的这种做法还是不错的

论坛徽章:
0
40 [报告]
发表于 2008-01-17 10:57 |只看该作者
呵呵。很替22楼lgfang可惜。
提了trie没人搭理。^_^
其实trie是很好的算法。推荐使用。

其次如果比较字符串很多,可以用字符串hash方式。
个人觉得如果<50的话, for()循环 或if..else也不是很坏。

对楼主的需求, 如果确实要效率,且不考虑内存,不如就用hash好了。
效率应该是最高的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP