Как уже говорилось в комментариях, немного сбивает с толку, почему логический флаг будет иметь следующий флаг в качестве значения. Вы также не упомянули, какой стандарт / версию C ++ вы используете.
Теперь я предполагаю, что ваш вопрос в том, что не так с алгоритмом?
- Во-первых, оператор break выпадает из цикла for (основной материал)
- без перерыва он также распечатает последний аргумент, но он также останется в цикле навсегда (начиная с первого увеличивающего указателя, а затем уменьшающего его)
Как указано в комментариях, он будетлучше сначала проверить «-», прежде чем увеличивать указатель. Также обратите внимание, что существует std :: next, который можно использовать здесь.
Я не уверен, что этот список (внутренне двойной связанный список) является лучшим контейнером здесь.
Если мыПредположим, что логический флаг не должен выводить значение, код может выглядеть следующим образом:
#include <iostream>
#include <string>
#include <vector>
int main() {
std::vector<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");
for (auto it = std::begin(args); it != std::end(args); ++it) {
if ((*it).at(0) == '-') {
std::cout << "key = " << (*it).substr(1) << std::endl;
auto next = std::next(it);
if ((*next).at(0) == '-'){
continue;
}else{
std::cout << "value = " << *(++it) << std::endl;
}
}
}
return 0;
}
Конечно, этот код не учитывает возможность того, что последний аргумент может быть только значением (без флага). Но это легко реализовать, если необходимо.
Я надеюсь, что это помогает, но я призываю вас также научиться отлаживать код:
- отладчик, имеет некоторую кривую обучения, но этоСтоит
- простой кут