C ++,sprintf_s的包装函数

时间:2014-07-29 06:06:30

标签: c++ printf

包含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()编写包装函数?

非常感谢。

1 个答案:

答案 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::stringstd::stringstream而不是char数组和s*printf调用。

应该编写C ++代码,好像C位不存在一样。否则,你更像是C +程序员而不是C ++程序员: - )