在使用snprintf
时,千万要注意一点,不要出现目标地址也是源地址的情况。看如下例子:
# include <stdio.h>
# include <string.h>
void f()
{
printf("snprintf(a, size, b, c)\n");
char a[100] = "1234";
char b[100] = "5678";
char c[100] = "";
memset(c, 0, 100);
snprintf(c, 100, "%s%s", a, b);
printf("a = %s\n", a);
printf("b = %s\n", b);
printf("c = %s\n", c);
}
void g()
{
printf("snprintf(a, size, a, b)\n");
char a[100] = "1234";
char b[100] = "5678";
snprintf(a, 100, "%s%s", a, b);
printf("a = %s\n", a); // 此处似乎a = 12345678,其实不然
printf("b = %s\n", b);
}
int main(int argc, char const *argv[])
{
f();
g();
return 0;
}
输出:
snprintf(a, size, b, c)
a = 1234
b = 5678
c = 12345678
snprintf(a, size, a, b)
a = 5678
b = 5678
之所以会出现这样的问题是因为snprintf
为了运行速度,而没有重新申请空间,具体原因请看snprintf
实现源码。