Я работал над этот ответ. И я столкнулся с загадкой scanf
имеет назначение подавления '*'
:
Если эта опция присутствует, функция не присваивает результат преобразования ни одному получающему аргументу.
Но когда используется в get_time
'*'
выдает ошибку времени выполнения в Visual Studio, libc ++ и libstdc ++: str >> get_time(&tmbuf, "%T.%*Y")
поэтому я считаю, что это не поддерживается.
Таким образом, я решил игнорировать ввод, читая в tmbuf.tm_year
дважды:
str >> get_time(&tmbuf, "%H:%M:%S.%Y UTC %b %d %Y");
Это работает и, кажется, мой единственный вариант, поскольку get_time
идет с '*'
не принято Но, как мы все знаем, то, что это работает, не означает, что оно определено. Может ли кто-нибудь подтвердить, что:
get_time
%Y
будет топать, а не 2йСтандарт определяет точный алгоритм обработки строки формата get_time
в 22.4.5.1.1 time_get
члены. (time_get::get
это то, что в конечном итоге называется, когда вы делаете str>>get_time(...)
). Я цитирую важные части:
Функция начинается с оценки
err = ios_base::goodbit
, Затем он входит в цикл, читая ноль или более символов изs
на каждой итерации. Если иное не указано ниже, цикл завершается, когда выполняется первое из следующих условий:(8.1) — Выражение
fmt == fmtend
оценивает как истинное.пропустить скучные части обработки ошибок
(8.4) — Следующий элемент
fmt
равно’%’
, за которым следует символ модификатора, за которым следует символ спецификатора преобразования, формат, вместе образующий спецификацию преобразования, действительную для функции ISO / IEC 9945strptime
, пропустить скучные части обработки ошибок функция оцениваетs = do_get(s, end, f, err, t, format, modifier)
пропустить более скучные части обработки ошибок функция увеличиваетсяfmt
чтобы указать только после окончания спецификации преобразования и продолжает цикл.
Как видно из описания, строка формата обрабатывается строго последовательно слева направо. Там нет положения для обработки повторяющихся спецификаций преобразования специально. Поэтому ответ должен быть да, то, что вы сделали, это четко определено и совершенно законно.
Других решений пока нет …