如何确定用户输入命令

How to determine user input commands

本文关键字:命令 输入 用户 何确定      更新时间:2023-10-16

我开始写一个命令行转换器,我唯一关心的是用户输入(休息不会很难)。程序将有一些命令,如(转换2m到km),所以当用户输入,程序将输出转换后的值。我的问题是,解析用户输入并确定用户输入的命令的最佳方法是什么?我是否应该将用户输入划分为单词数组,然后传递给函数,这样它就可以做一些事情,或者有另一种方式?

我已经编写了一些类型的"简单解析器"(以及一些更高级的)。根据你的描述,如果命令是"将2米转换为公里",那么你只需要在空间上分割东西。

当然,如果允许"convert2mtokm"answers"convert2mtokm",处理起来就有点困难了。坚持"单词之间必须有一个(至少一个)空格的严格规则"会让生活变得容易得多。

在这一点上,你将有一个可以处理的vector<string> cmd。例如:

if (cmd[0] == "convert")
{
    convert(cmd); 
}
... 
void convert(vector<string> cmd)
{
    double dist = stod(cmd[1]);
    string unit_from = cmd[2]; 
    string unit_to = cmd[4]; 
    if(cmd[3] != "to")
    {
         ... print some error ... 
    }
    double factor = unit_conversion(unit_from, unit_to);
    cout << "that becomes " << dist * factor << " in " << unit_to << endl;
}

如果您只有几个命令,那么最好只使用strtok(input, ' '),它只是将命令中的字符串拆分为一个单词数组(假设您的命令单词都用空格分隔)。然后,您可以执行一些简单的if/switch检查,以查看用户输入的命令。对于大量的命令(其中一些可能类似),您可能需要实现或至少编写一个DFA(确定性有限自动机)。

结构数组就可以了。结构可能是这样的:

struct cmd
{
    char **usrcmd;
    void (*fc)();
};

然后您只需要迭代数组并比较用户输入和usrcmd[0]字段(我假设命令是第一个单词)。

然而,如果你有很多用户命令要处理,这个解决方案不是最好的方法。