_vsnwprintf_s无法正常工作

时间:2015-03-30 17:00:50

标签: c

编写模块以将未命名的参数列表转换为字符串 输出不是所希望的。

void FormatOutput(wchar_t* formatstring, ...)
{
    wchar_t buffer[1024];
    memset(buffer, 0, sizeof(buffer));
    size_t size = lstrlenW(formatstring);
    va_list args;
    va_start(args, formatstring);
    size = _vsnwprintf_s(buffer, _countof(buffer), _TRUNCATE, formatstring, args);
    buffer[size] = L'\0';
    if (size < 0)
        __debugbreak();
    printf("size: %d, buff: %ls\n", size, buffer);
}

按以下方式调用模块

FormatOutput(L"%s %d %d %f %c", "34", 23,34,10.23,'c');

输出:

size: 19, buff :

实施中缺少什么?

2 个答案:

答案 0 :(得分:3)

您正在使用%s格式并在调用FormatOutput然后调用_vsnwprintf_s时发送单字节字符串参数。作为一个宽字符函数,_vsnwprintf_s%s视为%ls的同义词,并期望一个宽字符串参数。

要解决此问题,请切换到the %hs format,或传递宽字符串文字L"34"%cc也是如此,您需要使用%hc或传递L'c'作为参数。

答案 1 :(得分:0)

所需的更改是在调用模块时使用L"34"

FormatOutput(L"%s %d %d %f %c", L"34", 23,34,10.23,'c');

输出

size: 20, buff: 34 23 34 10.230000 c