swprintf() 带有窄字符串

Pet*_*ter 5 c c++ visual-studio-2010 visual-c++

以下代码行在 Visual Studio 2010 中给出了垃圾:

swprintf(buf, L"Value is %s", "abcd");
Run Code Online (Sandbox Code Playgroud)

但是,相同的代码在 Linux 上运行良好。

通过试用,我可以通过在 Visual Studio 下使用 %S 而不是 %s 来使其工作。

swprintf(buf, L"Value is %S", "abcd");
Run Code Online (Sandbox Code Playgroud)

我想知道这是 Visual Studio 2010 中的错误还是我遗漏了什么。问候。

Jam*_*lis 5

这是一个“错误”,尽管行为是设计使然。宽字符串 printf 和 scanf 函数的初始 Visual C++ 实现早于它们在 C 中的标准化,并且在某些情况下,行为偏离了 C 标准库规范的要求。

在 C 标准库规范中,%s%c格式说明符必须始终与char数组或元素配对,并且在提供数组或元素l时必须使用长度修饰符wchar_t

在这些函数(文档)的 Visual C++ 实现中,%s%c格式说明符需要“自然”宽度的相应参数。对于窄字符串 printf 和 scanf 函数,需要一个char指针或元素,而对于宽字符串函数,wchar_t则需要一个指针或元素。要传递“其他”宽度的字符串,可以使用%S%C格式说明符。或者,可以使用hl长度修饰符来明确指定字符串参数是窄字符串还是宽字符串。

在其它的优点,在Visual C ++实现的这些功能使得它可以很容易地迁移旧代码,通过使用Unicode字符串_TCHAR的映射<tchar.h>。不幸的是,标准化的内容与 Visual C++ 实现中已经实现的内容不同(我不熟悉这里的历史;可能标准化的内容与另一个实现相匹配。)。