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