C sprintf_s未在此范围内声明
我有一个C程序,它使用C sprintf_s未在此范围内声明,c,linux,tr24731,C,Linux,Tr24731,我有一个C程序,它使用sprintf\u s。它在Windows中运行良好,但当我在Linux中编译代码时,会出现以下错误: sprintf_s was not declared in this scope. 为什么会发生这种情况?我如何修复它?它不是标准的,在Linux上找不到这种功能 标准函数snprintf应该具有类似的语义。sprintf\u s不是标准C库的一部分,因此它不可移植,因此您无法在Linux中使用它。 但是您有snprintf,它非常类似,它应该可以帮助您实现您想要的功能
sprintf\u s
。它在Windows中运行良好,但当我在Linux中编译代码时,会出现以下错误:
sprintf_s was not declared in this scope.
为什么会发生这种情况?我如何修复它?它不是标准的,在Linux上找不到这种功能
标准函数
snprintf
应该具有类似的语义。sprintf\u s不是标准C库的一部分,因此它不可移植,因此您无法在Linux中使用它。
但是您有snprintf,它非常类似,它应该可以帮助您实现您想要的功能。sprintf\u s不是标准C库的一部分,您将无法在Linux中使用它
但是,
snprintf
是标准的,应该执行相同的任务。sprintf\u s
只是附录K的一部分,是C11标准的一个可选附录:
附件K
K.2范围
#define __STDC_WANT_LIB_EXT1__1
#include <stdio.h>
int sprintf_s(char * restrict s, rsize_t n,
const char * restrict format, ...);
\define\u STDC\u WANT\u LIB\u EXT1\u
#包括
intsprintf_s(字符*restrict s,rsize_t n,
常量字符*限制格式,…);
(增加重点)
它从未进入POSIX(或Linux)(而且根本没有被遗漏,甚至在委员会中也有关于它有用性的争论)
为了更好的可移植性,请使用作为核心标准的一部分并提供您所需的所有功能。在将我的程序从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;
}
inline int sprintf_s(字符*缓冲区、大小大小大小缓冲区、常量字符*格式,…)
{
va_列表ap;
va_开始(ap,格式);
int result=vsnprintf(缓冲区、大小缓冲区、格式、ap);
va_端(ap);
返回结果;
}
模板
内联int sprintf_s(字符和缓冲区)[sizeOfBuffer],常量字符*格式,…)
{
va_列表ap;
va_开始(ap,格式);
int result=vsnprintf(缓冲区、大小缓冲区、格式、ap);
va_端(ap);
返回结果;
}
snprintf是不安全的,只有sprint是安全的。
snprintf不保证添加最终\0,从而可能导致后续溢出。
查看是否有正确的实现。您可以使用
scanf
或sscanf
和%n
以及scanf
的返回值;实际上这是错的sprintf_s
是C11库扩展的一部分,是可选的实现。@Mgretz,如果不太麻烦的话,请粘贴包名好吗..太孤独了。。。我也想要这个答案:(snprintf
仅在C++11之后才存在,如果您在C++98中受到约束,问题仍然存在。缺少许多C11功能:参数检查、错误处理、%n检查、限制。返回值不得超过sizeOfBuffer。snprintf不安全,只有sprintf\s是安全的。snprintf不保证添加最终\0:“…超过n-1st的输出字符将被丢弃,而不是写入数组,并且在实际写入数组的字符末尾写入空字符。”