Я посмотрел %ls
для vsnprintf
и обнаружил, что это спецификатор формата для печати / форматирования строки широких символов, т. Е. wide_t *p = L"Hello world!";
Потребовалось немного воспроизведения и поиска широкого символаиспользование в C ++ (мне понравилась следующая страница: http://www.linux.com/archive/feed/51836),, но я думаю, что разобрался с вашей проблемой.
Если вы передадите строку char
в %ls
, то она не развернется, но если вы передаете строку wchar_t
в %ls
, тогда печатает.
Рассмотрим следующий пример кода I, основанный на вашей информации:
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <wchar.h>
char str[100];
void f (const char *format,
...)
{
va_list args;
va_start(args, format);
vsnprintf(str, sizeof(str), format, args);
va_end(args);
}
int
main ()
{
char *p1 = "1234";
char *p2 = "abcd";
wchar_t *pw1 = L"9876";
wchar_t *pw2 = L"wxyz";
f("%d_%d", 120, 199);
printf("numbers: %s\n", str);
f("%s_%s", p1, p2);
printf("char*: %s\n", str);
f("%ls_%ls", p1, p2);
printf("wide char* with char* input: %s\n", str);
f("%ls_%ls", pw1, pw2);
printf("wide char* with wide char* input: %s\n", str);
return (0);
}
Я скомпилировал это с помощью g ++.
make newtest.exe
g++ -g -c -MD -Wall -Werror newtest.cxx
g++ -o newtest.exe newtest.o -lc -lrt
Compilation finished at Thu Jul 29 08:54:57
Вывод ниже:
[SUSE10.1]:201> newtest.exe
numbers: 120_199
char*: 1234_abcd
wide char* with char* input:
wide char* with wide char* input: 9876_wxyz