包括banned.h(微软安全工具之一)后,编译器给我一个警告,sprintf()功能是不是安全,和MSDN中心给了我一个建议使用sprintf_s,因为我的项目是跨平台的,我写了一个包装的sprintf函数.
//safe function for sprintf();
void WrapperSprintf( char *buffer, const char *format, ... )
{
#ifdef _WIN32
sprintf_s(buffer, sizeof(buffer), format,...);
#else
sprintf(buffer, format, ...);
#endif
}
Run Code Online (Sandbox Code Playgroud)
它给我一个错误 sprintf_s(buffer, sizeof(buffer), format,...);
错误C2059:语法错误:'...'
任何人都知道如何编写包装函数sprintf_s()?
非常感谢.
它...并没有神奇地从函数声明转换为使用这些参数的其他调用.你必须包含变量参数stuff并使用它来调用下一级别.
步骤基本上是:
stdarg标题.va_list.va_start.v*printf功能.va_end.例如,这里有一个小程序,演示如何提供一个将格式化输出写入字符串的野兽,类似于您之后的情况:
#include <stdio.h>
#include <stdarg.h>
void x (char *buf, char *fmt, ...) {
va_list va;
va_start (va, fmt);
vsprintf (buf, fmt, va);
va_end (va);
}
int main (void) {
char buff[100];
x (buff, "Hello, %s, aged %d", "Pax", 40);
printf ("%s\n", buff);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我,我倾向于忽略微软关于sprintf不安全的建议.如果您不知道自己在做什么,可以说任何工具都是不安全的.如果你想成为一名优秀的C程序员,你将学习该语言的局限性和缺陷.
包括你sizeof在a上使用的char*那个,期望它返回它所指向的缓冲区的大小而不是指针的大小:-)
但是,如果您想成为C++开发人员,请成为 C++开发人员.虽然C和C++有很多共性,但它们并不是同一种语言.C++主要包含很多C语言,因此您可以(大部分)采用已编写的C代码并在C++应用程序中使用它.
换句话说,如果它是一个C++应用程序,使用std::string和std::stringstream,而不是char阵列和s*printf电话.
您应该编写C++代码,就好像C位不存在一样.否则,你更像是C +程序员而不是C++程序员:-)