Зачем нужен memset до strptime - PullRequest
0 голосов
/ 24 марта 2020

Для правильной работы этого кода необходимо использовать memset. Почему это так?

struct tm temp;
memset(&temp, 0, sizeof(struct tm));
strptime(str.c_str(), "%d-%m-%Y", &temp);

Почему этого недостаточно?

struct tm temp;
strptime(str.c_str(), "%d-%m-%Y", &temp);

Большое спасибо.

1 Ответ

0 голосов
/ 24 марта 2020

Из-за этого небольшого фрагмента в спецификации strptime (мой акцент):

значения для соответствующих tm элементов структуры установить значения, соответствующие информации о локали.

Другими словами, не обязательно устанавливать все поля структуры tm, поэтому вы инициализируете все в нули первый. В противном случае, будучи локальной переменной, она может иметь произвольную информацию во всех ее полях перед синтаксическим анализом строки времени (и после, если вы явно не анализируете соответствующий элемент).

Одна из причин, по которой это происходит (пропуск поля, которые вы явно не анализируете), потому что вы, возможно, уже настроили tm и хотите изменить только определенные поля (например, используя time() и localtime(), чтобы получить tm на сегодняшний день, и затем анализируем 17:00, чтобы получить указанное c время для сегодняшнего дня.

Есть хороший шанс, что, если вы будете только смотреть на поля, которые вы проанализировали, вам не придется беспокоиться о обнуление первым. Но также может существовать вероятность , что тот, кто написал вашу реализацию strptime, был "слишком умен" и решил, что может постмодировать данные, чтобы исправить проблемы. Например, если у вас есть 26:00:00 как время, и вы анализируете дату для March 1, она может изменить ее на March 2, 02:00:00.

Я не говорю, что это вероятно (или даже разрешено спецификации), но, учитывая минимальные затраты на обнуление конструкции заранее, я бы предпочел быть в безопасности. Тем более, что есть много людей, которые являются"слишком умными": -)

...