一、_vsnprintf,c语言库函数之一,属于可变参数。用于向字符串中打印数据、数据格式用户自定义。
函数原型: int vsnprintf(char* str,size_t size,const char* format,va_list ap);
参数说明: char* str[out] ,把生成的格式化的字符串放入此变量。
size_t [in] ,str可接受的最大字节数,防止产生数组越界。
const char* format[in],指定输出格式的字符串,他决定了你需要提供的可变参数的类型、个数和顺序。
va_list ap[in],va_list变量,va:Variable-argument:可变参数。
功能: 将可变参数格式化到一个字符数组。对比与vsprintf,增加了size限制,防止内存溢出。
但是格式化完成后没有加字符串结束符\0,所以要根据函数返回值,然后给字符串加字符结束符。
具体用法:需要先建立指向参数的指针va_list first; 然后就可以格式化,结束后要回收va_end(first);
void Display(const char* format,...)
{
char szBuffer[255] = {0};
va_list First;
va_start(First,format);
int nLen = _vsnprintf(szBuffer,sizeof(szBuffer),format,First);
va_end(First);
if (nLen)
{
szBuffer[nLen] = '\0';
}
printf("%s\n",szBuffer);
}
int _tmain()
{
const char* pData1 = "this";
const char* pData2 = "is";
const char* pData3 = "test";
Display("%s %s %s",pData1,pData2,pData3);
getchar();
return 0;
}
调用成功返回字符串的大小,失败返回负数。
二、第二个是_snprintf,将可变个参数(。。。)按照format格式化成字符串,然后复制到str中。
int _snprintf(char* Str,size_t size, const char* format,...);
如果格式化后的字符串长度小于size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符。
如果格式化后的字符串长度>=size,则只将其中的(size - 1)个字符复制到str中,并给其后添加一个字符串结束符。返回值为格式化后的字符串长度。
这个函数的可操作性就比较强。
若成功则返回欲写入的字符串长度,若出错则返回负值。
char szBuffer[1024] = {0};
SYSTEMTIME cTime;
::GetLocalTime(&cTime);
int nLen = _snprintf(szBuffer,sizeof(szBuffer),"%.4d %.2d %.2d ---%.2d:%.2d:%.2d\n",
cTime.wYear,cTime.wMonth,cTime.wDay,cTime.wHour,cTime.wMinute,cTime.wSecond);
if (nLen)
{
printf("%s\n",szBuffer);
}
这个函数还是比较省心的。暂时就先用这两个函数。