先来看一小段代码
#include <stdio.h>
int main()
{
char buf[12] = {0};
char *str = "ab";
sprintf(buf, "hello :%s\n", str);
printf("%s\n", buf);
return 0;
}
编译并运行以上程序,会打印输出
hello :ab
然而,当把程序改成
#include <stdio.h>
int main()
{
char buf[12] = {0};
char *str = "abcdefgh";
sprintf(buf, "hello :%s\n", str);
printf("%s\n", buf);
return 0;
}
再编译运行,程序可以正常编译,但是当运行程序时,程序就会终止,并报错
Abort trap: 6
说明sprintf函数是存在安全隐患的,可能当编写程序时,str变量可能会保存不同的内容,而且有很大可能出现上述安全隐患,
因此推荐使用sprintf安全改进版snprintf函数。
继续上边的例子
<pre name="code" class="plain">#include <stdio.h>
int main()
{
char buf[12] = {0};
char *str = "abcdefgh";
snprintf(buf, sizeof(buf), "hello :%s\n", str);
printf("%s\n", buf);
return 0;
}
对其中的参数做一下说明,第一个为目标字符串,第二个目标字符串的长度,第三个为原串。
安全性体现在哪里呢?第二个参数。
当要存储的字符串长度大于目标字符串长度时,会只保存目标串长度-1长度的字符串,并在末尾补\0字符串结束符。因此无论对str字符串作何处理,当使用snprintf时都能确保程序可以正常运行,从而提高程序的健壮性,不至于崩溃退出。
至于sprintf源代码细节有待进一步研究。