Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C sprintf_s未在此范围内声明_C_Linux_Tr24731 - Fatal编程技术网

C sprintf_s未在此范围内声明

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,它非常类似,它应该可以帮助您实现您想要的功能

我有一个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不是标准C库的一部分,您将无法在Linux中使用它


但是,
snprintf
是标准的,应该执行相同的任务。

sprintf\u 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, ...);
    
    \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的输出字符将被丢弃,而不是写入数组,并且在实际写入数组的字符末尾写入空字符。”