Я получаю необъяснимые сбои (возвращаемое значение -1) от vswprintf
при использовании GCC и Mac OS X (проверено с gcc 4.0 и 4.2.1 в Mac OS X 10.6 и 10.8. GCC под Linux не влияет. Visual Studio также не затрагивается).
Чтобы продемонстрировать проблему, я минимально адаптировал пример из здесь, чтобы он распечатывал vswprintf
возвращаемое значение:
/* vswprintf example */
#include <stdio.h>
#include <stdarg.h>
#include <wchar.h>
void PrintWide ( const wchar_t * format, ... )
{
wchar_t buffer[256];
va_list args;
va_start ( args, format );
int res = vswprintf ( buffer, 256, format, args );
wprintf ( L"result=%d\n", res );
fputws ( buffer, stdout );
va_end ( args );
}
int main ()
{
wchar_t str[] = L"test string has %d wide characters.\n";
PrintWide ( str, wcslen(str) );
return 0;
}
Из моих тестов видно, что, в зависимости от значения str
, vswprintf
иногда дает сбой. Примеры:
wchar_t str[] = L"test string has %d wide characters.\n"; // works
wchar_t str[] = L"ßß® test string has %d wide characters.\n"; // works
wchar_t str[] = L"日本語 test string has %d wide characters.\n"; // FAILS
wchar_t str[] = L"Π test string has %d wide characters.\n"; // FAILS
wchar_t str[] = L"\u03A0 test string has %d wide characters.\n"; // FAILS
Похоже, что любые строки, содержащие символы с кодовыми точками Unicode выше 0xff
, вызовут эту проблему. Может ли кто-нибудь пролить свет на то, почему это происходит? Кажется, это слишком большая проблема, чтобы не замечать ее раньше!
fputws
потерпит неудачу в локали"C"
по умолчанию для символов, выходящих за пределы допустимого диапазона, ноvswprintf
должен работать. - person Chris Dodd   schedule 16.03.2013vswprintf
не имеет ничего общего с GCC, он предоставляется библиотекой C ОС,libc
- person Jonathan Wakely   schedule 17.03.2013