Определено ли повторное присвоение для get_time?

Я работал над этот ответ. И я столкнулся с загадкой 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 идет с '*' не принято Но, как мы все знаем, то, что это работает, не означает, что оно определено. Может ли кто-нибудь подтвердить, что:

  1. Определено присвоить одну и ту же переменную дважды в get_time
  2. Поток всегда будет читаться слева направо, поэтому 1улицазаболеваемость %Y будет топать, а не 2й

0

Решение

Стандарт определяет точный алгоритм обработки строки формата 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 9945 strptime, пропустить скучные части обработки ошибок функция оценивает s = do_get(s, end, f, err, t, format, modifier) пропустить более скучные части обработки ошибок функция увеличивается fmt чтобы указать только после окончания спецификации преобразования и продолжает цикл.

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]