Вы не единственный человек, который собирается поддержать Ваш код.
следующий человек, который делает, мог бы иметь 17-дюймовый экран или, возможно, нуждался бы в больших шрифтах для чтения текста. Предел должен быть где-нибудь, и 80 символов соглашение из-за предыдущих экранных ограничений. Можно ли думать о каком-либо новом стандарте (120) и почему это - хорошая идея использовать это другой тогда, "это что соответствия на моем мониторе в шрифте Xpt?"
Помнят, всегда существуют исключения к каждому правилу так это, у Вас есть конкретная строка или блок кода, который имеет смысл быть больше чем 80 символами затем быть мятежником.
, Но занимают время сначала для размышления, "этот код действительно, что плохо, что он не может жить в 80 символах?"
Если вы уже используете Boost, вы можете сделать это с помощью алгоритмов повышения строки + повышения лексического приведения:
#include <boost/algorithm/string/predicate.hpp>
#include <boost/lexical_cast.hpp>
try {
if (boost::starts_with(argv[1], "--foo="))
foo_value = boost::lexical_cast<int>(argv[1]+6);
} catch (boost::bad_lexical_cast) {
// bad parameter
}
Такой подход, как и многие другие из других представленных здесь ответов подходит для очень простых задач, но в долгосрочной перспективе вам обычно лучше использовать библиотеку синтаксического анализа командной строки. У Boost есть один ( Boost.Program_options ), который может иметь смысл, если вы уже используете Boost.
В противном случае поиск «синтаксического анализатора командной строки c ++» даст ряд вариантов.
Вы бы сделали это так:
std::string prefix("--foo=");
if (!arg.compare(0, prefix.size(), prefix))
foo_value = atoi(arg.substr(prefix.size()).c_str());
Также неплохо было бы найти библиотеку, такую как Boost.ProgramOptions, которая сделает это за вас.
if(boost::starts_with(string_to_search, string_to_look_for))
intval = boost::lexical_cast<int>(string_to_search.substr(string_to_look_for.length()));
Это полностью не проверено. Принцип такой же, как у Python. Требуются Boost.StringAlgo и Boost.LexicalCast.
Проверить, начинается ли строка с другой строки, а затем получить подстроку («фрагмент») первой строки и преобразовать ее с помощью лексического преобразования.
Рискуя подвергнуться критике за использование конструкций C, я считаю, что этот пример sscanf
более элегантен, чем большинство решений Boost. И вам не нужно беспокоиться о связывании, если вы работаете в любом месте, где есть интерпретатор Python!
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
for (int i = 1; i != argc; ++i) {
int number = 0;
int size = 0;
sscanf(argv[i], "--foo=%d%n", &number, &size);
if (size == strlen(argv[i])) {
printf("number: %d\n", number);
}
else {
printf("not-a-number\n");
}
}
return 0;
}
Вот пример вывода, демонстрирующий, что решение обрабатывает начальный / конечный мусор так же правильно, как эквивалентный код Python, и более правильно все, что использует atoi
(который по ошибке игнорирует нечисловой суффикс).
$ ./scan --foo=2 --foo=2d --foo='2 ' ' --foo=2'
number: 2
not-a-number
not-a-number
not-a-number