C strftime имеет заканчивающиеся шестнадцатеричные символы - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь добавить заголовок Date к моему HTTP-ответу.До сих пор я делал что-то вроде этого:

char timebuf[37];
time_t now = time(0);
struct tm tm = *gmtime(&now);
strftime(timebuf, sizeof timebuf,"Date: %a, %d %b %Y %H:%M:%S %Z\r\n", &tm);)

Однако при проверке timebuf я иногда (как и при первом запросе сервера) получаю \x7f конечный символ.

Почему это противоречиво?Я дважды проверил размер timebuf, и он должен быть ровно 37.

1 Ответ

0 голосов
/ 08 февраля 2019

Строка формата, которую вы нам показали, приведет к строке длиной 37. Исключая терминатор NULL.

В вашем массиве должно быть 38 элементов!

В настоящее время ваш timebuf оставлен неопределенным, поэтому у вас есть неопределенное поведение в любом месте, которое ожидает строку с нулевым символом в конце.То, что вы видите \x7f иногда и другие символы иногда (предположительно даже \0 иногда), это просто случайность.


Из документации cppreference.com C на strftime:

Преобразует информацию о дате и времени из заданного календарного времени time в многобайтовую символьную строку с нулевым символом в конце str в соответствии со строкой формата format.Записывается до count байт.

А вот некоторые суммы:

Substr     Length
---------+--------
"Date: "     6
"%a"         3
", "         2
"%d"         2
" "          1
"%b"         3
" "          1
"%Y"         4
" "          1
"%H"         2
":"          1
"%M"         2
":"          1
"%S"         2
" "          1
"%Z"         4
"\r\n"       2

NULL term.   1
-----------------
         =   38
...