gpt4 book ai didi

c++ - 带有窄字符串的 swprintf()

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:28:59 26 4
gpt4 key购买 nike

以下代码行在 Visual Studio 2010 中产生垃圾:

swprintf(buf, L"Value is %s", "abcd");

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

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

swprintf(buf, L"Value is %S", "abcd");

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

最佳答案

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

在 C 标准库规范中,一个 %s%c格式说明符必须始终与 char 配对数组或元素,以及 lwchar_t 时必须使用长度修饰符提供数组或元素。

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

除其他优势外,这些函数的 Visual C++ 实现使得通过 the _TCHAR mappings in <tchar.h> 轻松迁移旧代码以使用 Unicode 字符串成为可能。 .不幸的是,标准化的内容与 Visual C++ 实现中已经实现的内容不同(我不熟悉这里的历史;可能标准化的内容与另一个实现相匹配。)。

关于c++ - 带有窄字符串的 swprintf(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23572077/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com