2015-03-30 3 views
1

Написание модуля для преобразования списка неназванных аргументов в строку Выход не является желаемым._vsnwprintf_s не работает по желанию

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 : 

Чего не хватает в реализации?

+1

Какой компилятор/библиотека? –

+0

@Matt Исправление в формате параметров исправило проблему. Я использую VS2013. – control

+0

BTW Почему вы инициализируете 'size'' 'lstrlenW (formatstring)'? Исходное значение, похоже, не используется. – user4815162342

ответ

3

Вы используете формат %s и отправляете однобайтовый аргумент символьной строки при вызове FormatOutput, а затем в _vsnwprintf_s. Будучи широкосимвольной функцией, _vsnwprintf_s рассматривает %s как синонимом %ls и ожидает широкий строковый аргумент.

Для решения проблемы перейдите на страницу the %hs format или пропустите широкоформатный литерал L"34". То же самое касается %c и c, где вам нужно использовать %hc или передать L'c' в качестве аргумента.

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