1、sprintf函数
sprintf函数原型为 intsprintf(char *str, const char *format, ...)。其中的格式控制字符串与printf的格式控制字符串的作用是一样的,表示的是参数的格式,而不是输入到str中的格式。作用是格式化字符串,具体功能如下所示:
(1)将数字变量转换为字符串。
(2)得到整型变量的16进制和8进制字符串。
(3)连接多个字符串。
举例如下所示:
1 char str[256] = {0};
2 int data = 1024;
3 //将data转换为字符串
4 sprintf(str,"%d",data);
5 //获取data的十六进制
6 sprintf(str,"0x%X",data);
7 //获取data的八进制
8 sprintf(str,"0%o",data);
9 constchar *s1 ="Hello";
10 constchar *s2 ="World";
11 //连接字符串s1和s2
12 sprintf(str,"%s %s",s1,s2);
2、snprintf函数
snprintf函数是sprintf函数的更加安全版本,考虑到字符串的字节数,防止了字符串溢出。函数形式为:int snprintf(char *restrict buf, size_t n, const char * restrict format, ...);。最多从源串中拷贝n-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n的话,将不会溢出。
源码实现:
glibc-2.18/stdio-common/snprintf.c:
#include <stdarg.h>
#include <stdio.h>
#include <libioP.h>
#define __vsnprintf(s, l, f, a) _IO_vsnprintf (s, l, f,a)
/* Write formatted output into S, according to the format
string FORMAT, writing no more than MAXLENcharacters. */
/* VARARGS3 */
int
__snprintf (char *s, size_t maxlen, const char *format, ...)
{
va_list arg;
int done;
va_start (arg, format);
done =__vsnprintf (s, maxlen, format, arg);
va_end (arg);
return done;
}
ldbl_weak_alias (__snprintf, snprintf)
使用_IO_vsnprintf函数实现:
glibc-2.18/libio/vsnprintf.c:
int
_IO_vsnprintf(string, maxlen, format, args)
char *string;
_IO_size_t maxlen;
const char *format;
_IO_va_list args;
{
_IO_strnfile sf;
int ret;
#ifdef _IO_MTSAFE_IO
sf.f._sbf._f._lock = NULL;
#endif
/* We need to handle the specialcase where MAXLEN is 0. Use the
overflowbuffer right from the start. */
if (maxlen == 0)
{
string = sf.overflow_buf;
maxlen = sizeof(sf.overflow_buf);
}
_IO_no_init (&sf.f._sbf._f, _IO_USER_LOCK, -1, NULL, NULL);
_IO_JUMPS (&sf.f._sbf) = &_IO_strn_jumps;
string[0] = '\0';
_IO_str_init_static_internal (&sf.f, string, maxlen - 1, string);
ret = _IO_vfprintf (&sf.f._sbf._f, format, args);
if (sf.f._sbf._f._IO_buf_base != sf.overflow_buf)
*sf.f._sbf._f._IO_write_ptr = '\0';
return ret;
}
参考网址:
http://www.cnblogs.com/Anker/p/3351168.html