确定字符串是否是C中的有效wchar_t*

Bil*_*low 3 c string wchar-t

我正在尝试重新编写printf的一部分.

setlocale(LC_ALL, "en_US.UTF-8");
int ret = printf("%S\n", "??????");
printf("Printf returned %d\n", ret);
Run Code Online (Sandbox Code Playgroud)

如果格式为%s,则printf写入宽字符并返回19.

如果格式为%S,则printf返回-1,因为参数不是宽字符串(在""之前没有L).

在我自己的printf实现中,如何确定参数中传递的字符串是否宽,所以如果不是,我可以返回-1?

编辑

  • 我正在使用OS X El Capitan进行编程(但如果有可能,我会想要一个可移植的解决方案)
  • 在我的编程环境中,%S和%ls是相同的 - 这对我的问题并不重要
  • 当我没有为格式为%s的示例设置区域设置时,Printf也返回-1.这是我设置语言环境的唯一原因.
  • 我正在使用clang编译(Apple LLVM版本7.0.0(clang-700.1.76))

fuz*_*fuz 6

基本上,你不能.传递不是宽字符串的东西%S不确定的行为,任何事情都可能发生,包括从鼻子里飞出来的dæmons.您很幸运能够printf捕获到这一点,很可能它会检测到"??????"解释为数组时的内容wchar_t并非都是有效的代码点(如果发生这种情况,errno则设置为EILSEQby printf).