1. enum枚举类型中的值是“符号常量”,对应值为整型值。不会是字符串,所以你想要从终端输入“add等函数名”是不能和枚举中的add比较的。因为enum
中的add是整型,默认第一位是0。 对于enum具体使用可以参考博客:https://blog.csdn.net/lixiaogang_theanswer/article/details/56681227
楼主,你想要的功能实现如下:
#define FUNC_LIST_NUM 4
#ifndef ALARM_ARRAY_SIZE
#define ALARM_ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
#endif
#define FIND_INDEX_BY_KEY(a, k, i) \
for(int j = 0; j < ALARM_ARRAY_SIZE(a); ++j) \
{ \
if(strlen(k) != strlen(a[j])) continue; \
if(!strncmp(a[j], k, strlen(k))) \
{ \
i = j; \
break; \
} \
}
const char *szGlobalFuncList[] = {"add", "gcd", "crt", "primroot"};
typedef void (*MatchingFunc[FUNC_LIST_NUM])(int a, int b);
void add(int a, int b){printf("a:%d\tb:%d\n", a, b);}
void gcd(int a, int b){printf("a:%d\tb:%d\n", a, b);}
void crt(int a, int b){printf("a:%d\tb:%d\n", a, b);}
void primroot(int a, int b){printf("a:%d\tb:%d\n", a, b);}
MatchingFunc SelectMFunc = {add, gcd, crt, primroot};
int main()
{
char buf[128] = {0};
int a = 0, b = 0;
int index = -1;
fgets(buf, sizeof(buf), stdin);
if(strlen(buf))
{
//add(a,b);
char *p = strstr(buf,"(");
if(p)
{
char funcName[56] = {0}; //函数名
strncpy(funcName, buf, strlen(buf)-strlen(p)); //funcName:函数名
p = strstr(p,",");
if(p)
{
//第一个值
char firstVar[56] = {0};
int len = strlen(funcName) + 1;
strncpy(firstVar, buf+ len , strlen(buf)-strlen(p)-len);
//第二个值
p = strstr(p, ")");
if(p)
{
char secondVar[56] = {0};
int len2 = len + strlen(firstVar) + 1;
strncpy(secondVar, buf+len2, strlen(buf)-len2-strlen(p));
FIND_INDEX_BY_KEY(szGlobalFuncList, funcName, index);
if(index >= 0)
{
a = atoi(firstVar);
b = atoi(secondVar);
SelectMFunc[index](a,b);
}
}
}
}
}
return 0;
}
效果:
现在支持你直接从终端输入:函数名(参数1的值,参数2的值);如:add(1,2). 后续若后新增函数,则直接在szGlobalFuncList数组后面添加就可以了。
若有帮助,还望楼主采纳!!非常感谢!!!!
/*================================================*/
楼主,对于你的评论,是这样的。这个得看你使用的编译器,不同编译器版本其效果不同,比如在linux系统下的gcc编译是可以通过的。在windows下的qt也是可以通过的。
我被CSDN禁言了,所以不能直接回复你的评论,只有在这里回复你刚才的评论了,望理解。