2010-11-04 121 views
1

我将现有的Windows应用程序移植到Linux。Linux中用于跨平台应用程序的sprint_f宏

大多数OS APIs \ Microsoft非标准扩展函数可以很容易地(或多或少)由等效的Linux \ GCC API取代,但是,我不知道如何处理sprintf_s,可变数量的参数。

有没有人有一个想法(如果你可以请把代码示例以及)?

谢谢大家提前。

回答

4

首先,你可以移植你的代码来使用C++ iostreams代替(例如ostringstream)吗?这将完全消除sprintf系列功能的所有可能问题,并且如果呼叫点数量有限,则可能是最佳选择。如果这不是一个选项:sprintf_s函数基本上是帮助我们防止错误(和外部滥用导致缓冲区溢出从http://msdn.microsoft.com/en-us/library/ce3zzk1k%28VS.80%29.aspx我们知道它有两件事:它检查格式字符串的有效格式(这并不意味着它检查类型 - 它仍然不能这样做),它允许指定一个最大长度

最好的替代品将是snprintf它确实有局限性与sprintf_s相比, t格式化字符串验证并非所有版本都保证最终的字符串会被终止:您总是希望在调用之后将null存储到缓冲区的最后一个字符中,以确保最终字符串为空ter minated。

0

snprintf具有相同的签名,但AFAIK的行为方式稍有不同。

0

sprintf_s只是一个“安全”版本(需要缓冲区长度作为额外的参数)的sprintf,你可以使用sprintf为你的端口吗?

+0

+1好的辅导('_s'变种都不是很安全的,无论如何,他们只是隐藏一些'sprintf'限制) 。 – 2010-11-04 13:28:00

+0

“反正不太安全”?什么? sprintf_s有一个额外的缓冲区长度参数,可以防止缓冲区溢出。你怎么能说它不安全,基于它不安全? – BJovke 2016-05-10 15:10:47

-1

为什么不只是提供sprintf_s for Linux的条件编译实现?这个实现可以简单地忽略额外的参数并通过sprintf()调用。

0

添加到源文件的头文件或开头结尾:

#ifndef _WIN32 
    #define sprintf_s(dest,len,format,...) sprintf(dest,format,__VA_ARGS__) 
#endif