如何在 Linux C++ 中使用 ***sprintf_s***

问题描述 投票:0回答:3

我正在尝试使用 Visual Studio 使用 Windows C++ 项目中的相同标头和

.cpp
文件创建 Linux C++ 项目。我正在使用
sprintf_s
将字符串转换为数组。

但是当我将相同的代码移植到 Linux 时,

sprintf_s
显示错误。
sprintf_s
还有其他替代品吗?

可以使用

snprintf
代替
sprintf_s
吗?

#if _WINDLL
        sprintf_s(DestinationArray, SourceString.c_str()); //Syntax using sprintf_s for Windows
#else

        snprintf(DestinationArray, SourceString.length(), SourceString.c_str()); //syntax using snprintf For Linux

#endif

上面的语法正确吗?我是 C++ 新手。请帮忙。

c++ cross-platform
3个回答
2
投票

sprintf_s 有其他替代品吗?

std::snprintf
。更好的是,您可以使用
std::string
和 iostreams。

使用 snprintf 代替 sprintf_s 可以吗?

std::snprintf
sprintf_s
的替代品。但是,将源字符串大小作为第二个参数传递是错误的。您应该传递目标缓冲区的大小。

此外,您首先就滥用了

sprintf_s
。您永远不应该使用非常量格式字符串。您似乎正在尝试简单地复制字符串。为此,有例如
strlcpy
(不是 C++ 中的标准,但存在于 BSD 和 Linux 中)。


1
投票

sprintf_s
传递
DestinationArray
的大小,而不是 SourceString。另外,不要将任意字符串作为格式字符串传递,这就是您获得格式字符串漏洞的方式。

更正确的表述:

#if _WINDLL
        sprintf_s(DestinationArray, "%s", SourceString.c_str()); //Syntax using sprintf_s for Windows
#else
        snprintf(DestinationArray, sizeof(DestinationArray), "%s",  SourceString.c_str()); //syntax using snprintf For Linux
#endif

或者您可以将 Linux 的

sprintf_s
定义为宏:

#define sprintf_s(buf, ...) snprintf((buf), sizeof(buf), __VA_ARGS__)

0
投票

我在 Linux 上使用这个宏:

#define sprintf_s(buffer, ...) snprintf((buffer), __VA_ARGS__)
© www.soinside.com 2019 - 2024. All rights reserved.