在控制台应用程序中解析命令

时间:2015-07-17 04:44:22

标签: c++ string command

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

2 个答案:

答案 0 :(得分: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 providesargp_parse

考虑或许在您的计划中嵌入interpreter ,例如嵌入GNU GuileLua。但嵌入口译员是一项重要的建筑设计决策,应尽早制定。然后您的申请将变为Turing-complete

答案 1 :(得分:0)

#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;
}