我正在尝试使用 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++ 新手。请帮忙。
sprintf_s 有其他替代品吗?
有
std::snprintf
。更好的是,您可以使用 std::string
和 iostreams。
使用 snprintf 代替 sprintf_s 可以吗?
std::snprintf
是 sprintf_s
的替代品。但是,将源字符串大小作为第二个参数传递是错误的。您应该传递目标缓冲区的大小。
此外,您首先就滥用了
sprintf_s
。您永远不应该使用非常量格式字符串。您似乎正在尝试简单地复制字符串。为此,有例如 strlcpy
(不是 C++ 中的标准,但存在于 BSD 和 Linux 中)。
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__)
我在 Linux 上使用这个宏:
#define sprintf_s(buffer, ...) snprintf((buffer), __VA_ARGS__)