我开始编写一个命令行转换器,我唯一关心的是用户输入(休息不会很难)。该程序将具有很少的命令(转换2米到km),因此当用户输入该命令时,程序将输出转换后的值。我的问题是,解析用户输入和确定用户输入的命令的最佳方法是什么?我应该将用户输入划分为单词数组然后传递给函数,这样它可以做某事还是有另一种方式?
答案 0 :(得分:1)
如果你只有一些命令,最好只有strtok(input, ' ')
,它只是将一个字符串拆分成命令中的一个字数组(假设你的命令字都用空格分隔)。然后,您可以执行一些简单的if / switch检查以查看用户输入的命令。对于大量命令(其中一些可能相似),您可能需要实现或至少写出DFA(确定性有限自动机)。
答案 1 :(得分:1)
我写过几种类型的“简单解析器”(以及一些更高级的解析器)。根据您的描述,如果命令是“将2米转换为km”,那么您只需要在空格上拆分。
当然,如果您允许“convert2mtokm”和“将2m转换为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;
}
答案 2 :(得分:0)
结构数组很好。结构可能是这样的:
struct cmd
{
char **usrcmd;
void (*fc)();
};
然后你只需要迭代数组并比较用户输入和usrcmd [0]字段(我假设命令是第一个字)。
但是,如果您要处理大量用户命令,则此解决方案不是最佳方法。