我有一个使用sprintf_s
的C程序。它在Windows中运行良好,但是当我在Linux中编译代码时,它会出现此错误:
sprintf_s was not declared in this scope.
为什么会发生这种情况,我该如何解决?
答案 0 :(得分:29)
这不是标准,你不会在Linux上找到这样的功能。
标准函数snprintf
应具有类似的语义。
答案 1 :(得分:7)
sprintf_s不是标准C库的一部分,因此它不可移植,因此您无法在Linux中使用它。 但是你有snprintf,它非常相似,它可以帮助你完成你想要的。
答案 2 :(得分:6)
sprintf_s
不是标准C库的一部分,您无法在Linux中使用它。
但是,snprintf
是标准的,应该执行相同的任务。
答案 3 :(得分:4)
sprintf_s
只是附件K的一部分,是C11标准的可选附件:
附件K
...
K.2范围
- 本附件指定了一系列 可选 扩展,可用于缓解 程序中的安全漏洞,包括新功能,宏和类型 在现有标准标题中声明或定义。
醇>...
K.3.5.3.6 sprintf_s函数
概要
#define __STDC_WANT_LIB_EXT1__1 #include <stdio.h> int sprintf_s(char * restrict s, rsize_t n, const char * restrict format, ...);
(强调补充)
它从未进入POSIX(或Linux)(并且根本没有错过,甚至有关于它在委员会中的用处的争论)。
为了更好的可移植性,请使用snprintf
,它是核心标准的一部分,并提供您需要的所有功能。
答案 4 :(得分:1)
snprintf不安全,只有sprintf_s是安全的。 snprintf不保证添加最终的\ 0,导致可能的后续溢出。 请查看https://github.com/rurban/safeclib以获得正确的实施。
答案 5 :(得分:0)
在我的程序从Windows移植到Linux的过程中,我在自己的windows.h中编写了以下实现:
inline int sprintf_s(char* buffer, size_t sizeOfBuffer, const char* format, ...)
{
va_list ap;
va_start(ap, format);
int result = vsnprintf(buffer, sizeOfBuffer, format, ap);
va_end(ap);
return result;
}
template<size_t sizeOfBuffer>
inline int sprintf_s(char (&buffer)[sizeOfBuffer], const char* format, ...)
{
va_list ap;
va_start(ap, format);
int result = vsnprintf(buffer, sizeOfBuffer, format, ap);
va_end(ap);
return result;
}