- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编写这样的代码是否有任何错误:
char* sp=(char*)malloc(128);
int x=22;
wsprintf(sp,"%d",x);
cout<<sp;
我专门询问安全错误?
最佳答案
这里存在许多“潜在”问题,其中没有一个实际上会影响任何内容,但您可能会发现事情的行为与您预期的不同。
首先:wsprintf,作为 Win32 API ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms647550(v=vs.85).aspx ),其原型(prototype)为:
int __cdecl wsprintf(
_Out_ LPTSTR lpOut,
_In_ LPCTSTR lpFmt,
_In_ ...
);
其中 LPTSTR
定义为 char*
或 wchar_t*
,具体取决于 UNICODE
的定义符号(检查您的项目设置和/或构建命令)
现在,如果您使用 ANSI 构建(无 UNICODE),则所有类型都是一致的,但不会检查 wsprintf 写入的内容是否超过您分配的 128 个字符。如果你只写一个十进制整数,那就没有问题,但是如果你(在你之后的其他人)稍后修改“消息”并且不进行检查,可能会出现一些意外(例如 wsprintf(sp,"This是我被告知应该是的数字:%d",x);
这仍然适合 128 个字符吗?!?)
如果您使用的是 UNICODE 版本,则分配 128 个字符,并在其上写入一个双字节字符串。数字 22 将被写为 \x32\x00\x32\x00\x00\x00
(3200 是 0x0032 的小端编码,它是对应于代表“2”的 UNICODE 50 的 wchar_t ')。如果将该序列提供给 cout (基于 char,而不是基于 wchar_t),将看到第一个\x00 作为字符串终止符,并将输出...只是“2”。
为了保持连贯,您应该:
char
的类型和函数(可以使用 malloc 和 cout,但使用 wsprintfA
而不是 wsprintf
)wchar_t
的类型和函数(malloc(128*sizeof(wchar_t))、wchar_t* 和 wsprintfW
)TCHAR
的类型(malloc(128*sizeof(TCHAR))、TCHAR* 和 wsprintf,但将 tcout
定义为 cout
或 wcout
取决于 UNICODE)。关于c++ - 将 wsprintf 与 malloc 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13157276/
为什么在以下代码上 wsprintf() 即使操作成功也会使应用程序崩溃? #include "Shlwapi.h" #include #include #include #pragma com
就像我们有 _stprintf 的安全版本,即 hp fortify bufferoverflow 的 stprintf_s警告,那么我们可以使用什么来代替 wsprintf()?我试过 wsprin
我必须使用 wsprintf 打印一条消息。我想将其打印在不同的行上,并且使用 '\n' 但它不起作用。这是代码示例: BYTE lbal = __inp(commandblock + ATA_LBA
当使用标准的 char* 字符串时,snprintf 和 vsnprintf 函数将返回输出字符串的长度,即使该字符串是由于溢出而被截断。* 似乎 ISO C 委员会在添加 swprintf 和 vs
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
编写这样的代码是否有任何错误: char* sp=(char*)malloc(128); int x=22; wsprintf(sp,"%d",x); cout<
我无法使用 wsprintf() 打印 double 值。我尝试了 sprintf(),它运行良好。 用于 wsprintf() 和 sprintf() 的语法如下: wsprintf(str,TEX
如下代码: int a = 16; wchar_t *buffer = {0}; wsprintf(buffer,L"%d", a); MessageBox(NULL, buffer, buffer,
我正在尝试使用 int 作为参数来获取格式化的 wchar_t*。我在谷歌上搜索了很多,但结果却更加困惑。因此,请考虑以下代码: int main(int argc, char** argv) {
在尝试输出一些计数字符串时,我遇到了 Microsoft 的 sprintf() 和 wsprintf() 函数之间的以下不对称性: #define _UNICODE sprintf(buff, "%
我似乎能够使用 MinGW 编译调用 wsprintf 的代码gcc 如果我有这些包括(按此顺序): #include #include #include 但我觉得可能有一些“更清洁”的方法来做
我正在编写一个低级记录器函数,它将文本字符串附加到文本(日志)文件的末尾。要求是此函数不应调用来自 DLL 的任何 WinAPI,这些 DLL 可能尚不可用于该进程——例如当它从 DllMain 调用
我是一名优秀的程序员,十分优秀!