qq_43635571
dlzy_deft
采纳率100%
2019-11-08 15:25

C语言strncmp 与枚举类型比对的问题。

25
已采纳

C语言如何使用strncmp函数 比对键盘输入的字符串 是否为 typedef enum 中枚举的某一函数,并进入这个函数执行?


啊好困惑

比如 枚举了以下自定义函数

            typedef enum mathfuntion
                                    {

                                   add,

                                    gcd,

                                    crt,

                                primroot//等等自定义函数名
                                    }mymathfuntion;

在命令提示符 键盘输入

add(1,2) 回车

                                                                                3

我的想法是使用strncmp 对比stdin数据流中的前3位是否是枚举类型中的某个函数 然后进入该函数执行

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

4条回答

  • lixiaogang_theanswer 君子黎 2年前

    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禁言了,所以不能直接回复你的评论,只有在这里回复你刚才的评论了,望理解。

    点赞 2 评论 复制链接分享
  • caozhy 回答这么多问题就耍赖把我的积分一笔勾销了 2年前
    这里不应该用枚举,而是应该用字符串
    char s[10];
    mymathfuntion f;
    gets(s);
    if (strcmp(s, "add") == 0)
    f = add;
    else if (strcmp(s, "gcd") == 0)
    f = gcd;
    else if (strcmp(s, "crt") == 0)
    f = crt
    else
    ...
    //下面调用
    f(a,b);
    
    点赞 3 评论 复制链接分享
  • qtchen_1988 qtchen_1988 2年前

    我感觉用strcmp不好实现,因为要相等字符串才能输出0;如果add(1,2) 跟 add 比 为1;但是要是输错了aed就会变成-1;所以不好比较(也可能我水平有限);

    我写了一个,你可以参考一下

    #include <iostream>
    #include <string.h>
    using namespace std;
    
    #define ARR_BUF 20
    
    int add(int x,int y)
    {
        return (x+y);
    }
    int gcd(int x,int y)
    {
        int t;
        while(y)
        {
            t=x%y;
            x=y;
            y=t;
        }
        return  x;
    }
    
    int main()
    {
        char arr[ARR_BUF] = {};
        scanf("%s",arr);
        int res = -1;
        int a = 0;
        int b = 0;
        bool a_finished = false;
        for(int i=0;i<ARR_BUF;i++){
            if(arr[i]>='0' && arr[i]<='9')
                if(!a_finished)
                    a = a*10+(arr[i]-'0');
                else
                    b = b*10+(arr[i]-'0');
            else
                if(a > 0)
                    a_finished = true;
        }
    
        if(arr[0]=='a' && arr[1]=='d' && arr[2]=='d')
            res = add(a,b);
        else if(arr[0]=='g' && arr[1]=='c' && arr[2]=='d')
            res = gcd(a,b);
    
        printf("Res: %d\n",res);
    
        return 0;
    }
    
    点赞 1 评论 复制链接分享
  • u010221760 黄国涛 2年前

    想法没错啊,是对比字符然后运行就好了,先截取前面三个字符赋值为str
    if(!strcmp(str,"add"))
    {
    然后取第一个参数a,和第二个参数b传入add函数
    add(a,b);
    }后面的gcd,crt同理

    点赞 评论 复制链接分享