一、_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); }
这个函数还是比较省心的。暂时就先用这两个函数。