【问题标题】:sprintf_s was not declared in this scopesprintf_s 未在此范围内声明
【发布时间】:2011-06-17 05:26:11
【问题描述】:

我有一个使用sprintf_s 的C 程序。它在 Windows 中运行良好,但是当我在 Linux 中编译我的代码时,它给出了这个错误:

sprintf_s was not declared in this scope.

为什么会发生这种情况,我该如何解决?

【问题讨论】:

    标签: c linux tr24731


    【解决方案1】:

    这不是标准的,你不会在Linux上找到这样的功能。

    标准函数snprintf应该有类似的语义。

    【讨论】:

    • 实际上现在这是错误的...sprintf_s 是 C11 库扩展的一部分,是一个可选实现。
    • @Mgretz,如果对你来说不是太麻烦的话,你能粘贴包名吗..
    • 好孤独……我也想要这个答案:(
    • snprintf自 C++11 起才存在,如果您受限于 C++98,问题仍然存在。
    【解决方案2】:

    sprintf_s 不是标准 C 库的一部分,因此它不可移植,因此您无法在 Linux 中使用它。 但是你有 snprintf,它非常相似,它应该可以帮助你完成你想要的。

    【讨论】:

      【解决方案3】:

      sprintf_s 只是附件 K 的一部分,是 C11 标准的可选附件

      附件 K

      ...

      K.2 范围

      1. 本附件指定了一系列可选扩展,可用于缓解 程序中的安全漏洞,包括新的函数、宏和类型 在现有标准头文件中声明或定义。

      ...

      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】:

        sprintf_s 不是标准 C 库的一部分,您将无法在 Linux 中使用它。

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

        【讨论】:

        • 可以使用scanfsscanf%n以及scanf的返回值;阅读scanf(3)
        【解决方案5】:

        在将我的程序从 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;
        }
        

        【讨论】:

        • 缺少许多 C11 功能:参数检查、错误处理、%n 检查、限制。返回值不能超过 sizeOfBuffer。
        【解决方案6】:

        snprintf 不安全,只有 sprintf_s 是安全的。 snprintf 不保证添加最终的 \0,从而导致可能的后续溢出。 查看https://github.com/rurban/safeclib 以获得正确的实现。

        【讨论】:

        • snprintf 不安全,只有 sprintf_s 是安全的。 snprintf 不保证添加最后的 \0 Not true: "... 第 n-1 个之后的输出字符被丢弃而不是写入数组,并且在末尾写入一个空字符实际写入数组的字符。”
        猜你喜欢
        • 2018-09-09
        • 1970-01-01
        • 1970-01-01
        • 2021-09-20
        • 2016-08-09
        • 2019-02-17
        • 2021-01-07
        • 2016-10-27
        相关资源
        最近更新 更多