gpt4 book ai didi

C++,sprintf_s 的包装函数

转载 作者:太空狗 更新时间:2023-10-29 23:50:57 27 4
gpt4 key购买 nike

包含 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,...); 行给我一个错误

error C2059: syntax error : '...'

有人知道如何为 sprintf_s() 编写包装函数吗?

非常感谢。

最佳答案

... 不会神奇地将函数声明转换为使用这些参数的其他调用。您必须包含可变参数内容并使用它来调用下一个级别。

基本步骤是:

  • 包含 stdarg header 。
  • 声明一个va_list
  • 调用 va_start
  • 调用 v*printf 函数之一。
  • 调用 va_end

例如,这里有一个小程序演示了如何提供一个将格式化输出写入字符串的 beast,类似于您想要的:

#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 程序员,您将了解该语言的局限性和弱点。

包括您在 char* 上使用 sizeof 的那个,期望它返回它指向的缓冲区的大小,而不是指针的大小:-)

但是,如果您想成为一名 C++ 开发人员,请成为 C++ 开发人员。虽然 C 和 C++ 有很多共同点,但它们不是同一种语言。 C++ 主要包含大量 C 内容,因此您可以(大部分)采用已编写的 C 代码并在您的 C++ 应用程序中使用它。

换句话说,如果它是 C++ 应用程序,请使用 std::stringstd::stringstream(a) 而不是 char 数组和 s*printf 调用。

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


(a) 当然,知识渊博的开发人员可能已经避开了 stringstream 固有的冗长内容,并开始使用诸如 fmtlib(具有 printf 的简洁性,但具有 C++ 开发人员开始欣赏的类型安全性)。

特别是,因为它被纳入 C++20,它将成为基础的一部分,可供所有人使用。

关于C++,sprintf_s 的包装函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25009116/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com