【问题标题】:Parsing commands in a console application在控制台应用程序中解析命令
【发布时间】:2015-10-06 17:51:00
【问题描述】:

所以我的控制台应用程序是基于命令的,例如用户可以输入“connect 127.0.0.1”,它会做一些事情。我已经能够将命令与参数分开,但是我如何让它根据命令字符串调用函数,并有一些东西可以将命令与其对应的字符串匹配?

【问题讨论】:

  • 这个问题不应该去programmers.stackexchange.com吗?
  • 为什么它应该去那里而不是这里?
  • 因为您的问题与您在其中显示的任何来源无关。

标签: c++ string command


【解决方案1】:

使用标准的parsing 技术,并从std::cin 读取命令

您可能想要为参数向量声明一个类型。

typedef std::vector<std::string> vectarg_T;

为处理命令的函数声明一个类型:

typedef std::function<void(vectarg_T)> commandprocess_T;

并有一个将命令名称与其处理器相关联的映射:

std::map<std::string,commandprocess_T> commandmap;

然后在初始化时填充该映射,例如使用匿名函数:

 commandmap["echo"] = [&](vectarg_T args){ 
    int cnt=0;
    for (auto& curarg: args) { 
      if (cnt++ > 0)   std::cout << ' ';
      std::cout << curarg;
    }
    std::cout << std::endl;
 };

如果您的问题是关于解析程序参数(main),请使用getopt(3) 和相关函数。 GNU libc provides 也有 argp_parse

考虑也许改为在您的程序中嵌入interpreter,例如嵌入GNU GuileLua。但是嵌入解释器是一个重要的架构设计决策,应该尽早做出。然后你的应用变成Turing-complete

【讨论】:

    【解决方案2】:
    #include <iostream>
    #include <map>
    #include <string>
    using namespace std;
    
    int main(int argc, const char * argv[]) {
    
        map<string,string> commands;
        cout<<argc<<endl;
        for(int i=1;i<=argc/2;i++)
        {
            string cmd =argv[i*2-1];
            string param =argv[i*2];
            cout<<cmd<<endl;
        }
        string ip = commands["connect"];
        cout<<"are you want to connect "<<ip<<" ?";
        return 0;
    }
    

    【讨论】:

    • 我建议你在你的代码中添加一个解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 2012-08-14
    • 2011-08-06
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多