我正在将现有的Windows应用程序移植到Linux。
大多数OS API \ Microsoft非标准扩展功能可以轻松(或多或少......)替换为等效的Linux \ GCC API,但是,我不知道如何处理变量sprintf_s争论的数量。
有没有人有想法(如果你可以请那么代码示例)?
提前谢谢大家。
答案 0 :(得分:5)
首先,您是否可以将代码移植到使用C ++ iostreams(例如ostringstream
)?这将完全消除sprintf
函数行的所有可能问题,如果有少量的调用点可能是最好的选择。
如果这不是一个选项:sprintf_s
函数基本上是一个帮助,以防止错误(和外部滥用导致缓冲区溢出。从http://msdn.microsoft.com/en-us/library/ce3zzk1k%28VS.80%29.aspx我们知道它做了两件事:它检查有效格式的格式字符串(这并不意味着它进行类型检查 - 它仍然不能这样做),它允许指定最大长度。
最佳替代品为snprintf
,与sprintf_s
相比确实存在限制。它不会进行格式字符串验证。并非所有版本都保证最终字符串将以空值终止:您总是希望在调用后将空值存储到缓冲区的最后一个字符中,以确保最终字符串为空终止。
答案 1 :(得分:0)
snprintf具有相同的签名,但AFAIK的行为略有不同。
答案 2 :(得分:0)
sprintf_s只是sprintf的一个“安全”版本(以缓冲区长度作为额外参数),你不能只使用sprintf作为你的端口吗?
答案 3 :(得分:0)
添加到头文件的末尾或源文件的开头:
#ifndef _WIN32
#define sprintf_s(dest,len,format,...) sprintf(dest,format,__VA_ARGS__)
#endif
答案 4 :(得分:-1)
为什么不直接为Linux提供sprintf_s的有条件编译实现?这个实现可以简单地忽略额外的参数并调用sprintf()。