sprintf和snprintf这两个函数的原型估计大家都很熟练了,这里要说的是这两个函数在使用时可能会出现的一个问题。
首先来看一段代码:
int main(int argc, char *argv[])
{
char buf[100];
memset(buf, 0, sizeof(buf));
snprintf(buf, sizeof(buf), "hello ");
snprintf(buf, sizeof(buf), "%stest/n", buf);
printf("%s");
return 0;
}
同样一段code,在同一个平台上有可能有不同的输出:
case 1: 输出"hello test"
case 2: 输出"test"
开始我没没整明白,后来一个个因素排除,找到了toolchain,原来不同的lib可能有不同的实现,有的sprintf/snprintf会在设值前将缓冲区全部初始化为0,而有的没有做,这就造成了输出结果的差异。
所以为保险起见,特别是为平台移植考虑,建议不要用这种风格,下面的sample code提供了一种方法:
int main(int argc, char *argv[])
{
char buf[100];
char *ptr = &buf[0];
memset(buf, 0, sizeof(buf));
ptr += snprintf(ptr, sizeof(buf)+buf-ptr, "hello ");
ptr += snprintf(ptr, sizeof(buf)+buf-ptr, "test");
printf("%s");
return 0;
}