0

我开始编写命令行转换器,我唯一关心的是用户输入(其余的不会很难)。该程序将只有很少的命令,例如(将 2 m 转换为 km),因此当用户输入该命令时,程序将输出转换后的值。我的问题是,解析用户输入并确定用户输入的命令的最佳方法是什么?我应该将用户输入分成单词数组,然后传递给一个函数,以便它可以做某事还是有另一种方式?

4

3 回答 3

1

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

于 2013-05-30T22:06:18.137 回答
1

我已经编写了几种类型的“简单解析器”(以及一些更高级的解析器)。根据您的描述,如果命令是“将 2 m 转换为 km”,那么您只需要在空格上拆分内容即可。

当然,如果你允许“convert2mtokm”和“convert 2m to km”,处理起来会有点困难。坚持“单词之间必须有(至少一个)空格的严格规则”让生活变得更轻松。

到那时,您将有一个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;
}
于 2013-05-30T22:10:47.440 回答
0

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

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

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

但是,如果您有很多用户命令要处理,那么这个解决方案并不是最好的方法。

于 2013-05-30T21:41:52.610 回答