dlzy_deft 2019-11-08 15:25 采纳率: 50%
浏览 490
已采纳

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

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


啊好困惑

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

            typedef enum mathfuntion
                                    {

                                   add,

                                    gcd,

                                    crt,

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

在命令提示符 键盘输入

add(1,2) 回车

                                                                                3

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

  • 写回答

4条回答 默认 最新

  • 内核之道 PostgreSQL领域优质创作者 2019-11-08 15:36
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥15 绘制多分类任务的roc曲线时只画出了一类的roc,其它的auc显示为nan
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?