【发布时间】:2019-09-30 14:26:05
【问题描述】:
我正在尝试编写命令行解析器。这是我以前使用的代码示例:
#include <iostream>
#include <string>
#include <vector>
#include <list>
int main() {
std::list<std::string> args;
args.push_back("-l");
args.push_back("-z");
args.push_back("123,abc");
args.push_back("-d");
args.push_back("/dev/null");
std::list<std::string>::iterator currentArgument;
for (currentArgument = args.begin(); currentArgument != args.end();) {
const std::string argString = *currentArgument++;
if (argString.at(0) == '-') {
std::cout << "key = " << argString.substr(1) << std::endl;
std::cout << "value = " << *currentArgument << std::endl;
} else {
--currentArgument;
break;
}
}
};
结果是:
key = l
value = -z
key = z
value = 123,abc
我尝试重写源代码,如 Java 中的示例: Args.java(parseArgumentStrings 方法)
问题是 bool -l 键,它没有值,我不需要通过在 -l 之后添加“1”或其他内容来修改 args 列表。我无法获得最后一个键和值,因为此时 argString 是“123,abc”。如果你查看源 Java 代码,它有 hasNext() 成员函数
那么,如何重写这段代码并得到如下输出:
key = l
value = -z
key = z
value = 123,abc
key = d
value = /dev/null
【问题讨论】:
-
为什么
--args.end()在currentArgument != --args.end()而不是简单的args.end()?是不是笔误? -
对不起,我错了,是的,一定是
args.end() -
key = l; value = -z你确定这是想要的行为而不是像空字符串这样的行为吗?我猜你可能会争辩说布尔标志的值是没有意义的,但似乎这会让使用这个解析器的人感到困惑。 -
@Anzipex 1) 所以,你不清楚什么是不清楚的。您编写了代码,如果条件
if (argString.at(0) == '-')为假,它将跳出循环。argString == "123,abc"时就是这种情况。 2) 当代码没有按照您的预期执行时,典型的做法是:使用调试器单步执行代码,同时在每个执行步骤调查变量的值。你试过吗? -
为什么不推迟
currentArgument++部分,直到您知道参数以-开头?这样您就不必减少else中的迭代器。