vswprintf() без размера буфера дает сбой на маленьком буфере вместо EOF. Как передать размер буфера

Использование Borland C++ Builder 2009

Я использую vswprintf в справке RAD Studio (F1):

int vswprintf(wchar_t *buffer, const wchar_t *format, va_list arglist); 

До сих пор я всегда предоставлял большой буфер wchar_t OutputStr[1000] и никогда не имел проблем. В качестве теста и желая сделать действие по улучшению, я попробовал небольшой буфер wchar_t OutputStr[12] и заметил, что программа полностью вылетает. Даже try{}catch(...){} не улавливает. Codeguard сообщает, что memcpy() дает сбой, что, по-видимому, является внутренней реализацией. Вместо этого я ожидал EOF в качестве возвращаемого значения.

При поиске в Интернете для vswprintf я обнаружил, что вариант С++ принимает размер буфера в качестве входных данных, но я не могу убедить свой компилятор использовать этот вариант? Любая идея, как заставить его использовать BCB2009?

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

Не знаете, как лучше всего проверить точное количество необходимых байтов/символов?


person Peter    schedule 28.01.2016    source источник
comment
Все функции sprintf... без указания размера буфера имеют эту проблему. Функция не может узнать фактический размер буфера, поэтому они не могут raise() выдать ошибку, когда превысят его.   -  person wallyk    schedule 28.01.2016
comment
может попробовать _vsnwprintf   -  person M.M    schedule 28.01.2016
comment
@M.M _vsnwprintf работает. Спасибо ! Любая идея, как я могу проверить, сколько байтов/символов мне нужно, если буфер слишком мал? vsnwprintf_s был бы хорош для этого, но он не включен в c++Builder 2009.   -  person Peter    schedule 28.01.2016
comment
@Peter, вызывающий его с помощью 0 для размера, должен возвращать требуемый размер, ничего не записывая   -  person M.M    schedule 28.01.2016
comment
@ М. М. Я пробовал, но не работает. В онлайн-документации MS это также не упоминается. ( msdn.microsoft.com/en-us/library/1kt27hek.aspx )   -  person Peter    schedule 28.01.2016
comment
Разве это не фантастика, когда поставщики компиляторов выпускают свои худшие версии стандартных функций.. :) Другой доступный вам вариант - получить бесплатную исходную реализацию стандартной версии vswprintf.   -  person M.M    schedule 28.01.2016
comment
@M.M Это то, что заставляет нас быть занятыми, верно :) На самом деле я мог бы просто увеличить буфер до глупого размера и сделать это таким образом для нескольких странных инцидентов, которые могут произойти. Если, конечно, идеальная функция не за горами.   -  person Peter    schedule 28.01.2016
comment
@M.M см. комментарий, который я сделал к предложенному ответу ниже: vsnprintf   -  person Peter    schedule 28.01.2016
comment
@M.M Я имел в виду vsnwprintf (извините за это). Это беспорядок.   -  person Peter    schedule 28.01.2016


Ответы (1)


Вы можете использовать vswprintf_s. Возвращает отрицательное значение в случае ошибки

person Jacob Seleznev    schedule 28.01.2016
comment
Звучит именно так, как мне нужно, но BCB2009, кажется, не знает эту функцию? Это было добавлено в более поздних версиях? (stdio.h включено) - person Peter; 28.01.2016
comment
Правильно. Библиотека Secure C была добавлена ​​в C++Builder 2010. - person Jacob Seleznev; 28.01.2016
comment
_vsnwprintf, кажется, помогает. Теперь, чтобы узнать, сколько байтов/символов мне нужно, если буфер недостаточно велик... - person Peter; 28.01.2016
comment
@Peter _vsnwprintf, если nsize равен 0, возвращает необходимое количество байтов , не включая завершающий символ '\0'. - person Jacob Seleznev; 28.01.2016
comment
Я не боюсь. Не согласно моему тестированию (возвращает -1) и не согласно документам MS ( msdn.microsoft.com/en-us/library/1kt27hek.aspx ) - person Peter; 28.01.2016
comment
Давайте продолжим обсуждение в чате. - person Jacob Seleznev; 28.01.2016
comment
если я использую vsnprintf (без начального подчеркивания), это также работает, но эта функция всегда возвращает необходимое количество символов, независимо от того, достаточно ли велик буфер или нет. Так ведь простой способ проверить и сразу выделить достаточно памяти. Я не могу найти подходящую документацию для этого, я случайно наткнулся на нее из-за опечатки ... представьте ... - person Peter; 28.01.2016
comment
@M.M Я имел в виду vsnwprintf (извините за это). - person Peter; 28.01.2016