Как делают я проверяю если станд. C++:: строка запускается с определенной строки, и преобразуйте подстроку в интервал?

Вы не единственный человек, который собирается поддержать Ваш код.

следующий человек, который делает, мог бы иметь 17-дюймовый экран или, возможно, нуждался бы в больших шрифтах для чтения текста. Предел должен быть где-нибудь, и 80 символов соглашение из-за предыдущих экранных ограничений. Можно ли думать о каком-либо новом стандарте (120) и почему это - хорошая идея использовать это другой тогда, "это что соответствия на моем мониторе в шрифте Xpt?"

Помнят, всегда существуют исключения к каждому правилу так это, у Вас есть конкретная строка или блок кода, который имеет смысл быть больше чем 80 символами затем быть мятежником.

, Но занимают время сначала для размышления, "этот код действительно, что плохо, что он не может жить в 80 символах?"

212
задан vallismortis 16 November 2018 в 06:11
поделиться

4 ответа

Если вы уже используете 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 ++» даст ряд вариантов.

85
ответ дан 23 November 2019 в 04:29
поделиться

Вы бы сделали это так:

std::string prefix("--foo=");
if (!arg.compare(0, prefix.size(), prefix))
    foo_value = atoi(arg.substr(prefix.size()).c_str());

Также неплохо было бы найти библиотеку, такую ​​как Boost.ProgramOptions, которая сделает это за вас.

183
ответ дан 23 November 2019 в 04:29
поделиться
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.

Проверить, начинается ли строка с другой строки, а затем получить подстроку («фрагмент») первой строки и преобразовать ее с помощью лексического преобразования.

-3
ответ дан 23 November 2019 в 04:29
поделиться

Рискуя подвергнуться критике за использование конструкций 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
10
ответ дан 23 November 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: