sprintf函数是一个变参函数,除了前面两个参数之外,后面的参数都不是类型安全的,它的代码实现如下:
int sprintf(char * buf, const char *fmt, ...)
{
va_list args;
int i;
va_start(args, fmt);
i=vsnprintf(buf, INT_MAX, fmt, args);
va_end(args);
return i;
}
它常用来连接字符串以及将整数打印到字符串中去,在连接字符串方面要比strcat灵活。如
str1 = "test";
str2 = "function";
sprintf(buf,“This is a %s string for sprintf %s",str1,str2);
在用sprintf直接连接两个字符串时,即sprintf(buf,"%s%s",str1,str2) 时要特别小心,因为有时我们的两段字符缓冲区,他们并不都是以'/0'结尾。比如许多从第三方库函数中返回的字符数组,从硬件或者网络传输中读进来的字符流,它们未必每一段字符序列后面都有个相应的'/0'来结尾。如果直接连接,不管是sprintf 还是strcat 肯定会导致非法内存操作,strncat 也要求第一个参数是个null结尾的字符串。可以使用sprintf(buf, "%.6s%.5s", str1, str2);的方法,""%.6s"中的6表示最多从str1中取6个字符。
在打印整数时sprintf(s, "%08X", 4567);表示以16进制打印整数4567,最多打印8个字符不足的部分前面补0。