【发布时间】:2019-02-06 08:35:02
【问题描述】:
我正在修复在 linux 和 windows 上运行的遗留代码,在某些情况下,应该包含格式化内容的缓冲区小于该内容。
代码使用根据documentation的swprintf
size - 最多可以写入 size - 1 个字符,加上空终止符
确实会截断字符串,但是在coliru 上尝试时遇到了意想不到的结果:
#include <iostream>
#include <string>
#include <cwchar>
int main()
{
wchar_t wide[5];
std::swprintf(wide, sizeof wide/sizeof *wide, L"%ls", L"111111111");
std::wcout << wide;
}
将导致1111?? 但是
#include <iostream>
#include <string>
#include <cwchar>
int main()
{
wchar_t wide[20];
std::swprintf(wide, sizeof wide/sizeof *wide, L"%ls", L"111111111");
std::wcout << wide;
}
工作得很好。
怎么了?
附:
我希望我可以将所有内容更改为 C++ 流/字符串,但我不能,wchar_t 数组无处不在
【问题讨论】:
-
使用大量数组并不意味着不能使用流 I/O。
std::ostream有一个write()方法,您可以将(一块)数组传递给 -
我的意思是,标准库流 IO 并不是 API 设计的典范。
-
@Spinkoo 很好,
swprintf()采用缓冲区大小进行边界检查和截断。听起来更像是 OP 的 STL 库在其swprintf()实现中有一个错误,如果缓冲区填充到允许的最大字符,它不会正确写出终止 null。 -
啊,是的,我同意你的看法
-
@RemyLebeau 我不相信这是一个错误,尽管 IMO 它在 C 中的指定不足。请参阅我的回答 - 欢迎提出想法!