29

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

sprintf_s was not declared in this scope.

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

4

6 回答 6

42

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

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

于 2011-01-28T12:32:21.703 回答
9

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

于 2011-01-28T12:46:36.097 回答
8

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核心标准的一部分并提供您需要的所有功能。

于 2014-11-01T21:20:56.387 回答
6

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

但是,snprintf这是标准的,应该做同样的任务。

于 2014-11-01T21:11:44.110 回答
1

在将我的程序从 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;
}
于 2017-06-13T12:00:21.200 回答
1

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

于 2017-10-16T10:14:37.963 回答