包含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
}
它在第sprintf_s(buffer, sizeof(buffer), format,...);
行
错误C2059:语法错误:' ...'
任何人都知道如何为sprintf_s()
编写包装函数?
非常感谢。
答案 0 :(得分:8)
使用这些参数,...
不会从函数声明神奇地转换为其他调用。你必须包含变量参数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;
}
我,我倾向于忽略微软关于sprintf
不安全的建议。如果您不知道自己在做什么,并且可以说任何工具,那只是不安全的。如果你想成为一名优秀的C程序员,你将学习该语言的局限性和缺陷。
包括在sizeof
上使用char*
的那个,期望它返回它指向的缓冲区的大小而不是指针的大小: - )
但是,如果您想成为 C ++ 开发人员,那么 是一名C ++开发人员。虽然C和C ++有很多共性,但它们不是相同的语言。 C ++主要包含很多C语言,因此您可以(大部分)使用已编写的C代码并在C ++应用程序中使用它。
换句话说,如果它是C ++应用程序,请使用std::string
和std::stringstream
而不是char
数组和s*printf
调用。
你应该编写C ++代码,好像C位不存在一样。否则,你更像是C +程序员而不是C ++程序员: - )