user-0 提问: 字符串能不能转成枚举常量？或者给一个方法。谢谢

回复:
user: user-0
content: 引用 20 楼 Charce1989 的回复:我觉得 你不要定义enum  定义个字符串数组，和你的函数指针数组 对应，每次解析命令之后在字符串数组里找到，然后返回下标，利用这个下标再去函数指针数组找对应的function  。 弄个结构体  直接初始化进去命令和函数。哎估计只能这样了。谢谢你

user: user-0
content: 引用 18 楼 zhao4zhong1 的回复:仅供参考：//codegen.c // 输入一组字符串，比如 // aa ss ddd dd 33 dd // 然后自动生成一个函数 int A(const char*); // 实现A("aa")返回0  A("ss")返回1 依次类推 #include <stdio.h> int main(int argc,char **argv) {     int i;     if (argc<2) {         printf("%s p1 [p2 ...] [>result.c]\nGenerate code int A(const char *a); 0==A(\"p1\") 1==A(\"p2\") ...",argv[0]);         return 1;     }     //printf("#include <string.h>\n");     printf("int A(const char *a) {\n");     for (i=0;i<argc-1;i++) {         printf("    if (0==strcmp(a,\"%s\")) return %d;\n",argv[i+1],i);     }     printf("    return -1;\n");     printf("}\n");     return 0; } //C:\test\Debug>codegen.exe //codegen.exe p1 [p2 ...] [>result.c] //Generate code int A(const char *a); 0==A("p1") 1==A("p2") ... //C:\test\Debug>codegen.exe aa ss ddd dd 33 dd //int A(const char *a) { //    if (0==strcmp(a,"aa")) return 0; //    if (0==strcmp(a,"ss")) return 1; //    if (0==strcmp(a,"ddd")) return 2; //    if (0==strcmp(a,"dd")) return 3; //    if (0==strcmp(a,"33")) return 4; //    if (0==strcmp(a,"dd")) return 5; //    return -1; //} // //c:\test\Debug>codegen.exe aa ss ddd dd 33 dd >result.c // //c:\test\Debug>type result.c //int A(const char *a) { //    if (0==strcmp(a,"aa")) return 0; //    if (0==strcmp(a,"ss")) return 1; //    if (0==strcmp(a,"ddd")) return 2; //    if (0==strcmp(a,"dd")) return 3; //    if (0==strcmp(a,"33")) return 4; //    if (0==strcmp(a,"dd")) return 5; //    return -1; //} //  我感觉这样不太好，因为我还要判断函数是否执行成功return SUCCESS。而且这样我感觉这个函数有点大，因为要判断50多次我有50多个命令。我还是改了吧。哎大改特改，以后写代码要先构思好。还是谢谢赵四老师了

user: user-0
content: 引用 17 楼 zhangxiangDavaid 的回复:[quote=引用 6 楼 leee7338 的回复:] [quote=引用 5 楼 fly_dragon_fly 的回复:] 这种命令通常不会太长,直接查找命令试试看 typedef void (*EXEC)(char *); void helloAbc(char *){} struct disp{     char *cmd;     EXEC fun; } Disp[]={     { "ABC", helloAbc } }; 引用 5 楼 fly_dragon_fly 的回复:就是把命令和函数都放到一个结构体里面，定义一个结构体数组么？ 大概是这样：  typedef void(*EXEC)(char *, char *); void fun1(char *s1, char *s2) {} void fun2(char *s1, char *s2) {} void fun3(char *s1, char *s2) {} struct disp { 	char *cmd; 	EXEC fun; } Disp[] = { 	{"C_ABC", fun1}, 	{"C_DEF", fun2}, 	{"C_GHI", fun3}, }; int main(void) { 	int i; 	char *cmd = "C_ABC"; 	for (i = 0; i < 3; i++) 	{ 		if (0 == strcmp(Disp[i].cmd, cmd)) 			Disp[i].fun();    //这里还需传入合适的参数 	} 	return 0; } [/quote] 估计只能这样了。

user: user-1
content: 命令是字符串，枚举是int型，估计只能比较。

user: user-2
content: 我觉得 你不要定义enum  定义个字符串数组，和你的函数指针数组 对应，每次解析命令之后在字符串数组里找到，然后返回下标，利用这个下标再去函数指针数组找对应的function  。

user: user-3
content: 引用 12 楼 mewiteor 的回复:[quote=引用 10 楼 leee7338 的回复:] [quote=引用 9 楼 mewiteor 的回复:] 串口发的字符串集你能改吗？ 比如用单个字符可以直接用字符的ascii码作枚举常量的值， 或者有4个字符的相同长度的字符串用 *(int*)string 作枚举常量的值。  如果不能改可以用字典树 能说的稍微明白点  或者举个例子么[/quote] 你能否把命令简化为单个字符，比如：A、B、C、…… 如果可以的话，以字符为下标，调用：func['A'](...); 这样就比较方便。  如果不能改串口发出的命令集，那你就百度一个Trie树的代码吧。[/quote] 也可以将命令集排好序放入一个数组中，比如：struct{char *code;int (*func)(char*,char*);} array[]={{"C_ABC",function1},{"C_DEF",function2},{"C_GHI",function3}}; 然后用bsearch二分搜索。

user: user-4
content: 呵呵, 对上面补充下: 如果对字符串算法处理后, 其值于一小范围内, 如: 100015 - 100045; 此时就可以用数组了.

user: user-4
content: 对命令字符串进行算法处理(如: C_ABC = "c" << 0 +  "B" << 8 + 'A' << 16 + 'C' << 24); 然后排序(树也可以);  查找时候先用算法处理, 再用二分法查找...

user: user-3
content: 引用 10 楼 leee7338 的回复:[quote=引用 9 楼 mewiteor 的回复:] 串口发的字符串集你能改吗？ 比如用单个字符可以直接用字符的ascii码作枚举常量的值， 或者有4个字符的相同长度的字符串用 *(int*)string 作枚举常量的值。  如果不能改可以用字典树 能说的稍微明白点  或者举个例子么[/quote] 你能否把命令简化为单个字符，比如：A、B、C、…… 如果可以的话，以字符为下标，调用：func['A'](...); 这样就比较方便。  如果不能改串口发出的命令集，那你就百度一个Trie树的代码吧。

user: user-5
content: 楼主要是不想改动大的话，也可以map(string,emnu)   一下， 不过这样做没有楼上几个个方法直接，有点冗余

user: user-0
content: 引用 9 楼 mewiteor 的回复:串口发的字符串集你能改吗？ 比如用单个字符可以直接用字符的ascii码作枚举常量的值， 或者有4个字符的相同长度的字符串用 *(int*)string 作枚举常量的值。  如果不能改可以用字典树 能说的稍微明白点  或者举个例子么

user: user-3
content: 串口发的字符串集你能改吗？ 比如用单个字符可以直接用字符的ascii码作枚举常量的值， 或者有4个字符的相同长度的字符串用 *(int*)string 作枚举常量的值。  如果不能改可以用字典树

user: user-0
content: 请大家给一个好的方法。

user: user-6
content: std::map<std::string, std::function<int(char*,char*)>>

user: user-0
content: 引用 5 楼 fly_dragon_fly 的回复:这种命令通常不会太长,直接查找命令试试看 typedef void (*EXEC)(char *); void helloAbc(char *){} struct disp{     char *cmd;     EXEC fun; } Disp[]={     { "ABC", helloAbc } };  [quote=引用 5 楼 fly_dragon_fly 的回复:] 就是把命令和函数都放到一个结构体里面，定义一个结构体数组么？

user: user-7
content: 这种命令通常不会太长,直接查找命令试试看 typedef void (*EXEC)(char *); void helloAbc(char *){} struct disp{     char *cmd;     EXEC fun; } Disp[]={     { "ABC", helloAbc } };

user: user-0
content: 引用 2 楼 jiqiang01234 的回复:把枚举值和对应的字符串做映射 请问怎么映射？

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:enum { C_ABC, //0 C_DEF,//1 C_GHT,//2 .........},  我是想根据解析出来的字符串来确定要用哪个函数处理

user: user-8
content: 把枚举值和对应的字符串做映射

user: user-9
content: 仅供参考：//codegen.c // 输入一组字符串，比如 // aa ss ddd dd 33 dd // 然后自动生成一个函数 int A(const char*); // 实现A("aa")返回0  A("ss")返回1 依次类推 #include <stdio.h> int main(int argc,char **argv) {     int i;     if (argc<2) {         printf("%s p1 [p2 ...] [>result.c]\nGenerate code int A(const char *a); 0==A(\"p1\") 1==A(\"p2\") ...",argv[0]);         return 1;     }     //printf("#include <string.h>\n");     printf("int A(const char *a) {\n");     for (i=0;i<argc-1;i++) {         printf("    if (0==strcmp(a,\"%s\")) return %d;\n",argv[i+1],i);     }     printf("    return -1;\n");     printf("}\n");     return 0; } //C:\test\Debug>codegen.exe //codegen.exe p1 [p2 ...] [>result.c] //Generate code int A(const char *a); 0==A("p1") 1==A("p2") ... //C:\test\Debug>codegen.exe aa ss ddd dd 33 dd //int A(const char *a) { //    if (0==strcmp(a,"aa")) return 0; //    if (0==strcmp(a,"ss")) return 1; //    if (0==strcmp(a,"ddd")) return 2; //    if (0==strcmp(a,"dd")) return 3; //    if (0==strcmp(a,"33")) return 4; //    if (0==strcmp(a,"dd")) return 5; //    return -1; //} // //c:\test\Debug>codegen.exe aa ss ddd dd 33 dd >result.c // //c:\test\Debug>type result.c //int A(const char *a) { //    if (0==strcmp(a,"aa")) return 0; //    if (0==strcmp(a,"ss")) return 1; //    if (0==strcmp(a,"ddd")) return 2; //    if (0==strcmp(a,"dd")) return 3; //    if (0==strcmp(a,"33")) return 4; //    if (0==strcmp(a,"dd")) return 5; //    return -1; //} //