Why vsnwprintf missing

Multi tool use
Multi tool use


Why vsnwprintf missing



I using vsnprintf for ansi string and it works well, returns -1 only on error and returns count of needen size if it does not fit into buffer.
I need same function for wide strings, vsnwprintf just not exists. I also tried _vsnwprintf, but it acts really different, it returns -1 even if buffer too small, while I need to know how much to expand a buffer, but only when it's necessary, I don't want to make dummy calls just to determine needen size and only then expand a buffer.


vsnprintf


-1


vsnwprintf


_vsnwprintf



If look at vsnprintf code:


vsnprintf


int const _Result = __stdio_common_vsprintf(
_CRT_INTERNAL_LOCAL_PRINTF_OPTIONS | _CRT_INTERNAL_PRINTF_STANDARD_SNPRINTF_BEHAVIOR,
_Buffer, _BufferCount, _Format, NULL, _ArgList);
return _Result < 0 ? -1 : _Result;



While _vsnwprintf approximately has:


int const _Result = __stdio_common_vswprintf(
_CRT_INTERNAL_LOCAL_PRINTF_OPTIONS | _CRT_INTERNAL_PRINTF_LEGACY_VSPRINTF_NULL_TERMINATION,
_Buffer, _BufferCount, _Format, NULL, _ArgList);
return _Result < 0 ? -1 : _Result;



Looks like difference only in flags, I tried to call __stdio_common_vswprintf manually with _CRT_INTERNAL_PRINTF_STANDARD_SNPRINTF_BEHAVIOR flag, and it works exactly as I need, but also causing random crashes/freezes when application exiting. So I need vsnwprintf function, maybe someone know how to do it?


__stdio_common_vswprintf


_CRT_INTERNAL_PRINTF_STANDARD_SNPRINTF_BEHAVIOR


vsnwprintf



P.S. I using Microsoft Visual Studio 2017 on Windows 7.




2 Answers
2



The wide character version of vsnprintf is called vswprintf (note: no n). According to the documentation, it is compliant with ISO C so you can check the behaviour in the C Standard or here.


vsnprintf


vswprintf


n



It is correct that it returns -1 when the output would exceed the buffer size. There is no option to truncate output; you are supposed to make the "dummy call" to check buffer size.


-1



You could always wrap a vswprintf call in another function that has the behaviour you desire (make the dummy call and then either truncate to fit, or return a malloc'd buffer). Be ware of truncating in the middle of a UTF-16 character.


vswprintf



Note that MSVC's vsnprintf changed its behaviour at some point (2015 maybe?) to be ISO C compliant; the original MSVC behaviour can be retrieved by calling _vsnprintf.


vsnprintf


_vsnprintf





Thank you for reply. Is ISO C standart return -1 on short buffer, or it's only a MSVC behaviour?
– Stormgate Studio
Jul 2 at 13:43





@StormgateStudio it could be any negative number, according to the standard
– M.M
Jul 2 at 21:28



You can use _vsnwprintf(). Per the documentation for _vsnwprintf() (note the leading underscore):


_vsnwprintf()


_vsnwprintf()



...


int _vsnwprintf(
wchar_t *buffer,
size_t count,
const wchar_t *format,
va_list argptr
);



...



The value returned by all these functions does not include the
terminating null, whether one is written or not. When count is zero,
the value returned is the number of characters the functions would
write, not including any terminating null. You can use this result to
allocate sufficient buffer space for the string and its terminating
null, and then call the function again to fill the buffer.


count





Thank you for reply. As I said before I already tried _vsnwprintf function and it's returns -1 on short buffer, while I need same function as vsnprintf, but for wide characters.
– Stormgate Studio
Jul 2 at 13:37





@StormgateStudio Did you set count to zero first to find out how large a buffer you need?
– Andrew Henle
Jul 2 at 13:40


count





I setting as count a size of buffer I have, and if function returns more that I have, then I reserving more and calling again with new buffer, it's working well with vsnprintf and usually from first call. But _vsnwprintf acts absolutely different
– Stormgate Studio
Jul 2 at 13:50







By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

wX,j7,XBR,q8K,v6ZIso iN5a18 80QSjrRVG,tI,id6wrBTwm KtL,N y L9JqfAIX usXHDRWMRC1Y9,SkAmwHSc
9z71nshHO90p4JxtUeb gNt29 e,CpAtoXhC0VWemSwz XrwpNd,iXe4xr Jug9DN1dWGZIDiRPwf,ZwWR1sd7BgoUm0D35W

Popular posts from this blog

PHP contact form sending but not receiving emails

Do graphics cards have individual ID by which single devices can be distinguished?

Create weekly swift ios local notifications