答复: [cpp] 怎么高效实现从char[] 到byte的转换?
Leon
wb197 at citiz.net
Tue Mar 20 13:41:16 CST 2007
这样转义了还是没有做到表驱动方式,依然是case结构。中间有三步操作,实际上效果
还是要一一比对stricmp之后才能得到结果。
应该采用hash字符串,将字符串编码成hash值,然后得到对应的数字结果。一次hash值
计算并查找就能得到结果。
云风blog上推荐了lua的字符串hash code实现方法,可以直接用。
-----邮件原件-----
发件人: cpp-bounces at codingnow.com [mailto:cpp-bounces at codingnow.com] 代表
hit_pc
发送时间: 2007年3月20日 13:15
收件人: C++ Discuss Group
主题: Re: [cpp] 怎么高效实现从char[] 到byte的转换?
On Tue, 20 Mar 2007 12:30:06 +0800, Fei Xu <flyingxu at gmail.com> wrote:
> 比如有这样的一个表:
> mov 01
> add 02
> div 03
> ...
> end 99
如果你这个表是编译以前知道的,使用enmu,
enum week{Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};
week today = Tuesday;
switch(today)
{
case Monday:
cout<<"Monday<<endl";
break;
case Tuesday:
cout<<"Tuesday"<<endl;
break;
default:
cerr<<"Wrong!!"<<endl;
break;
}
----------------------------------------------------------------
如果不是,使用下面这个解决办法:
// 定义一个用于转义判断的结构
typedef struct tagShift{
// 建议这里用enum,避免出现Magic Number
unsigned int uIdx;
const char *pStr;
}Shift,*PShift;
// 声明一张转义表
Shift g_ShiftTable[] =
{
// 建议这里用enum,避免出现Magic Number
{ 1, "TestCmd1"},
{ 2, "TestCmd2"},
{ 3, "TestCmd3"},
{ 4, "TestCmd4"},
{ 5, "TestCmd5"},
{ 6, "TestCmd6"},
{ 7, "TestCmd7"},
{ 0, NULL},
};
// 实现一个转义函数
unsigned int GetShiftValue(const char * lpStr) {
for (PShift *p = g_ShiftTable[0]; p->pStr; p ++)
{
if (0 == strcmpi(p->pStr, lpStr)) return p->uIdx;
}
return p->uIdx;
}
// 在switch语句中这样写
const char *pStr = "TestCmd7";
switch(GetShiftValue(pStr))
{
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
default:
break;
}
>
> 现在要根据传入的char*(也就是"move""add"之类)得到对应的数字 01, 02
>
> 简单的说当然就是
> if(c == "")
> ...;
> else if(c == "")
> ....;
>
> 但是这样写起来很麻烦,执行起来似乎效率也不高,有好办法吗?
>
--
Hello,World.
-LegolasKiss
More information about the Cpp
mailing list