если полученное значение int64_t равно 132408394771256230
, то sprintf()
преобразует его в 132408394771256230\n\0\003
нет, sprintf
записывает только 132408394771256230\n\0
в str и пусть остальная часть массива не изменится, символ кода 3 присутствовал до вызова sprintf
(массив не инициализирован), но, конечно, это может быть что угодно.
Из-за дополнительных значений мусора, добавленных в конец строки, программа не может вставить данное значение и затем завершает работу.
снова нет, PQexecParams управляет параметрами как массив строк (одна строка в вашем случае) в соответствии с соглашением, строка заканчивается нулевым символом, PQexecParams не читает / не заботится о том, что находится после нулевого символа, и делает знать даже о «конверте» вашей строки (массив из 21 символа в вашем случае).
Вероятно, ваша проблема возникает из-за нежелательной новой строки в вашей строке, в результате чего команда будет строкой
INSERT INTO dummy VALUES(1,to_timestamp(132408394771256230\n)::timestamp)
просто удалите \n
в формате вашего sprintf
.
Предположим, что необходимо иметь новую строку, ваш массив должен иметь размер 22, а не 21, чтобы управлять отрицательным значением без записи неопределенного поведения из массива.
... какое-то значение мусора
вы наверняка видите нулевой символ и байт после, потому что вы используете отладчик, и этот отладчик знает, что str имеет размер 21 и когда вы запрашиваете значение str , отладчик рассматривает str как массив символов, а не строку. Если вы попросите отладчик показать (char*) str
, он будет рассматривать str как строку и не будет отображать нулевой символ или следующий за ним символ.
[править]
Функция запрашивает дату и время в виде строки гггг-мм-дд чч: мм: сс вместо вашего большого числа an ua_datetime
Чтобы преобразовать ua_datetime в ожидаемую строку, используйте (см. документацию ):
nt ua_datetime_snprintf (char * dst, size_t size, const ua_datetime * dt)
результатом будет строка YYYY-MM-DDThh: mm: ss.nnnZ , поэтому после простой замены последней точки нулевым символом и 'T' пробелом (предположим, что 'T' действительно создается, попробуйте и адаптироваться)
Другой способ - использовать:
time_t ua_datetime_to_time_t(const ua_datetime * dt)
, а затем сделать вашу строку со стандартной функцией из time_t
В любом случае вы должны понимать, что теряете большую точность, ua_datetime находится в 100 наносекундах, а * временная метка postgress - только в секундах