【发布时间】:2011-06-17 05:26:11
【问题描述】:
我有一个使用sprintf_s 的C 程序。它在 Windows 中运行良好,但是当我在 Linux 中编译我的代码时,它给出了这个错误:
sprintf_s was not declared in this scope.
为什么会发生这种情况,我该如何解决?
【问题讨论】:
我有一个使用sprintf_s 的C 程序。它在 Windows 中运行良好,但是当我在 Linux 中编译我的代码时,它给出了这个错误:
sprintf_s was not declared in this scope.
为什么会发生这种情况,我该如何解决?
【问题讨论】:
这不是标准的,你不会在Linux上找到这样的功能。
标准函数snprintf应该有类似的语义。
【讨论】:
sprintf_s 是 C11 库扩展的一部分,是一个可选实现。
snprintf自 C++11 起才存在,如果您受限于 C++98,问题仍然存在。
sprintf_s 不是标准 C 库的一部分,因此它不可移植,因此您无法在 Linux 中使用它。 但是你有 snprintf,它非常相似,它应该可以帮助你完成你想要的。
【讨论】:
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,它是核心标准的一部分,可提供您需要的所有功能。
【讨论】:
sprintf_s 不是标准 C 库的一部分,您将无法在 Linux 中使用它。
但是,snprintf 是标准的,应该执行相同的任务。
【讨论】:
scanf或sscanf和%n以及scanf的返回值;阅读scanf(3)
在将我的程序从 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;
}
【讨论】:
snprintf 不安全,只有 sprintf_s 是安全的。 snprintf 不保证添加最终的 \0,从而导致可能的后续溢出。 查看https://github.com/rurban/safeclib 以获得正确的实现。
【讨论】: