sprintf/snprintf 陷阱[转]
Posted szqmvp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sprintf/snprintf 陷阱[转]相关的知识,希望对你有一定的参考价值。
最近 ubuntu/debian 正在讨论 sprintf/snprintf 的问题,我在这描述一遍。sprintf 的原型为:
int sprintf(char *restrict s, const char *restrict format, ...);
其中 char* restrict s 的含义为通过s 指向的内存空间不得与其他指针参数指向的内存的空间重叠。比如如下的语句就是错误的用法, 因为参数1与参数3指向的内存重叠了。但这种做法作为增强版的 strcat 已被广泛使用。
sprintf(buf, "%s foo %d %d", buf, var1, var2);
在 ubuntu 8.10 所带的 gcc 中,如果编译时加入了优化选项(比如 -O1, -O2), 那么sprinf 会首先将 s 清空,比如如下的程序会输出 "fail", 而不是 "not fail"。
作为补救方案,可以使用如下的语句来代替:#include <stdio.h> char buf[80] = "not ";
int main()
{
sprintf(buf, "%sfail", buf);
puts(buf);
return 0;
}
sprintf(buf+strlen(buf), " foo %d %d", var1, var2);
以上是关于sprintf/snprintf 陷阱[转]的主要内容,如果未能解决你的问题,请参考以下文章
Linux C 字符串函数 sprintf()snprintf() 详解
printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf - 输出格式转换