LINUX.ORG.RU

Распарсить аргумент командной строки в 3 переменные

 


1

3

Т.е. есть аргумент вида год.месяц.число (2015.10.12, например). Нужно соответственно присвоить переменным y1, m1, d1 значения 2015 (год), 10 (месяц) и 12 (день).
А ещё было бы неплохо приложить ссылку на годную документацию по этому всему (желательно на русском).
Заранее спасибо (.

★★★★★

string split

вариантов тьма, от boost до regex.

anonymous
()

Стандартного решения не существует. Можно взять готовое решение из Qt или какого-нибудь boost. Или если нужно сделать быстро — <regex>.
Ну и scanf как выше упомянули, конечно же.

ktan ★★★
()
Последнее исправление: ktan (всего исправлений: 1)
#include <pcrecpp>
<…>
int y1, m1, d1;

pcrecpp::RE("(\\d+)\.(\\d+)\.(\\d+)").FullMatch(argv[arg], &y1, &m1, &d1);
<…>
redgremlin ★★★★★
()
Последнее исправление: redgremlin (всего исправлений: 1)
#include <iostream>
#include <sstream>
#include <ctime>
using namespace std;
int main(int arg, char** argv) {
	cout << argv[1] << endl;
    struct tm tm;
    if (strptime(argv[1], "%Y.%m.%d", &tm)) {
        int d = tm.tm_mday,
            m = tm.tm_mon + 1,
            y = tm.tm_year + 1900;
        cout << y << "." << m << "." << d << endl;
    }
}

g++ time.cpp && ./a.out 2015.10.12

conalex ★★★
()
Ответ на: комментарий от conalex

Спасибствую, всё работает. Только вот мне ещё понимание надо того, как оно работает. Где можно почитать?

sudopacman ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Ну я, положим, ленивый и старый, и сам так делаю потому что " working with the «pure» C++ iostreams, strings and stringstreams may seem tedious at first"«С++ is just superset of C»(с)" и мне лениво :) Но

«01.01.1970»

2016, не? :) Пример с PCRE вообще убил. Чо не boost::regex<regex>, как первый аноним предложил?

А еще

strptime()

О, да, плюсую. Ультимейт стандарт вей.

Нет документации, кроме Стандарта, и https://cppreference.com пророк его.

Оказывается внезапно Ультимейт стандарт вей такой стандард шо 5.1 и непортабелен А «пророк его» ссылается на strftime, но не strptime() :)

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 2)
Ответ на: комментарий от conalex
> if (strptime(argv[1], «%Y.%m.%d», &tm))

Не кроссплатформенно:

test.cpp: In function `int main(int, char**)':
test.cpp:8: error: `strptime' undeclared (first use this function)
test.cpp:8: error: (Each undeclared identifier is reported only once for each function it appears in.)
Dev-C++ (devcpp-4.9.9.2_setup.exe)
mingw32-g++.exe --version
mingw32-g++.exe (GCC) 3.4.2 (mingw-special)
Dev-Cpp 5.11 TDM-GCC 4.9.2 Setup.exe - аналогично, нет такой функции.

pacify ★★★★★
()
Последнее исправление: pacify (всего исправлений: 1)
Ответ на: комментарий от annulen

boost

Иначе не Ъ-С++-но

а std::get_time() тоже не ъ-с++-но?

f1u77y ★★★★
()
Ответ на: комментарий от slackwarrior

Пример с PCRE вообще убил. Чо не boost::regex<regex>, как первый

Регулярки и так уже в стандарте.

anonymous
()
Ответ на: комментарий от conalex

Те кто плюётся на указание языка как C/C++ - любуйтесь, вот он во всей своей красе. Микс из «cout <<» и «struct tm».

unC0Rr ★★★★★
()
Ответ на: комментарий от slackwarrior

Чо не <regex>

Он сломан на RHEL/CentOS 7 же, только в 4.9 починили, а новый GCC из software collections не всегда удобно использовать.

anonymous
()
Ответ на: комментарий от anonymous

А ты не давай дураку, если сам не дурак :) А то вон оружие совсем дуракам не дают (с вод. правами правда недоработка еще у беш. принтера) Еще искуссвенные проблемы?

slackwarrior ★★★★★
()
Ответ на: комментарий от slackwarrior

Какая разница что останавливает ССЗБ, а что нет. Пользовать фичи, недоступные в основной онтопик-платформе - это дурной тон.

anonymous
()
Ответ на: комментарий от anonymous

Чтоб ничего не менять есть «Тут так принято» и еще много оправданий :) Кто хочет - делает, кто не хочет - приводит религиозные аргументы. Но за них не платят.

slackwarrior ★★★★★
()
Ответ на: комментарий от slackwarrior

Платят за софт, который собирается и работает. Осознанно делать свой софт (неважно открытый или закрытый) несобираемым на изкоробочном RHEL/CentOS - для этого нужны веские основания.

anonymous
()
Ответ на: комментарий от anonymous

Осознанно делать свой софт (неважно открытый или закрытый) несобираемым на изкоробочном RHEL/CentOS - для этого нужны веские основания.

Еще страшных историй расскажи, про платный софт который кто-то должен кроме разработчика собирать :)

slackwarrior ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.