我在使用GCC和Mac OS X的vswprintf中遇到了莫名其妙的错误(返回值-1)(在Mac OS X 10.6和10.8下使用gcc 4.0和4.2.1进行了测试。Linux下的GCC受到的影响,而不受的影响。VisualStudio也受到的影响)不受影响)。

为了演示该问题,我从here最小化了该示例,以便它打印出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

似乎任何包含0xff上方具有Unicode代码点的字符的字符串都将触发此问题。任何人都可以弄清楚为什么会这样吗?似乎是一个太大的问题,以前从未注意到过!

最佳答案

如果设置语言环境,就可以了。要获取环境变量,您可以执行以下操作:

setlocale(LC_CTYPE, "");   // include <locale.h>

或显式设置。这是因为所有输出函数都需要知道要使用哪种编码。

OS X完全无法执行vswprintf,而Linux运行它(尽管如果打印,字符将不正确)。

这是glibc文档中的相关部分:

07-24 14:00